Vấn đề là JAX-RS dictates rằng tham số unbundling được thực hiện theo một trong hai cách sau:
- bean tham số có một constructor nào chấp nhận một String
- Tham số đậu có phương thức tĩnh
valueOf(String)
.
Trong trường hợp của bạn, Ngày được bỏ nhóm thông qua công cụ xây dựng Date(String)
, không thể xử lý định dạng đầu vào mà khách hàng của bạn đang gửi. Bạn có một vài tùy chọn có sẵn để khắc phục điều này:
Lựa chọn 1
Nhận khách hàng của bạn để thay đổi định dạng ngày trước khi họ gửi đi. Đây là lý tưởng, nhưng có lẽ là khó khăn nhất để hoàn thành!
Lựa chọn 2
Xử lý định dạng ngày điên. Các tùy chọn cho điều này là:
Thay đổi chữ ký phương thức của bạn để chấp nhận một chuỗi. Cố gắng xây dựng một đối tượng Date trong số đó và nếu điều đó không thành công, hãy sử dụng lớp SimpleDateFormat tùy chỉnh của riêng bạn để phân tích nó.
static final DateFormat CRAZY_FORMAT = new SimpleDateFormat("");
public String getData(@QueryParam("date") String dateString) {
final Date date;
try {
date = new Date(dateString); // yes, I know this is a deprecated method
} catch(Exception e) {
date = CRAZY_FORMAT.parse(dateString);
}
}
Xác định lớp tham số của riêng bạn mà không logic nêu trên. Cung cấp cho nó một hàm tạo chuỗi hoặc phương thức tĩnh valueOf(String)
gọi logic. Và một phương pháp bổ sung để có được ngày khi tất cả được nói và thực hiện.
public class DateParameter implements Serializable {
public static DateParameter valueOf(String dateString) {
try {
date = new Date(dateString); // yes, I know this is a deprecated method
} catch(Exception e) {
date = CRAZY_FORMAT.parse(dateString);
}
}
private Date date;
// Constructor, Getters, Setters
}
public String getData(@QueryParam("date") DateParameter dateParam) {
final Date date = dateParam.getDate();
}
Hoặc cuối cùng, bạn có thể đăng ký một handler tham số cho những ngày. Trường hợp logic của nó chỉ đơn giản là giống như đã đề cập cho các tùy chọn khác ở trên. Lưu ý rằng bạn cần phải sử dụng ít nhất CXF 2.5.3 để có trình xử lý tham số được đánh giá trước khi nó thử logic mặc định không được gộp.
public class DateHandler implements ParameterHandler<Date> {
public Map fromString(String s) {
final Date date;
try {
date = new Date(dateString); // yes, I know this is a deprecated method
} catch(Exception e) {
date = CRAZY_FORMAT.parse(dateString);
}
}
}
Không chắc chắn ý của bạn là gì bởi 'kết quả trong ngày được gửi là Thu Mar 01 22:33:10 IST 2012', vì bạn đang * nhận * ngày, không * gửi * một. Đảm bảo rằng URL bạn đang gọi được mã hóa chính xác trước khi gọi nó. – Perception
Đã chỉnh sửa bài đăng để làm rõ. URL được mã hóa chính xác. Khách hàng của tôi đang gửi tham số ngày là 'Thu Mar 01 22:33:10 IST 2012' và dịch vụ của tôi cũng nhận được thông báo đó. Tuy nhiên, ngày ở định dạng không thể phân tích cú pháp (nếu tôi sử dụng ParameterHandler) hoặc không thể sử dụng bởi CXF để trực tiếp tạo đối tượng Date. – domino
Điều đó làm cho mọi việc rõ ràng hơn. Dẫn đến câu hỏi tiếp theo - là phương pháp này dự kiến cũng sẽ có thể xử lý ngày ở định dạng khác (tiêu chuẩn hơn)? – Perception