问题在于 JAX-RS 规定参数解绑应通过以下两种方式之一完成:
- 参数 Bean 具有接受字符串的公共构造函数
- 参数 bean 具有静态方法。
valueOf(String)
在您的例子中,Date 是通过其构造函数解绑的,该构造函数无法处理客户端正在发送的输入格式。您有几个选项可用于解决此问题:Date(String)
备选案文1
让您的客户在发送日期之前更改日期的格式。这是理想的,但可能是最难实现的!
备选案文2
处理疯狂的日期格式。选项包括:
更改方法签名以接受字符串。尝试从中构造一个 Date 对象,如果失败,请使用您自己的自定义 SimpleDateFormat 类来解析它。
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);
}
}
定义您自己的参数类,以执行上述逻辑。为它指定一个调用逻辑的字符串构造函数或静态值Of(String)
方法。还有一种额外的方法,可以在所有说完和完成时获得日期。
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();
}
或者,最后,您可以为日期注册参数处理程序。其中,其逻辑与上述其他选项的逻辑完全相同。请注意,您需要至少使用 CXF 2.5.3,以便在参数处理程序尝试默认解绑逻辑之前对其进行计算。
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);
}
}
}