dom*_*ino 44 java rest service cxf jax-rs
我的服务定义如下.
public String getData(@QueryParam("date") Date date)
我正试图java.util.Date从我的客户端(它是jaxrs:CXF的客户端,而不是通用HTTP客户端或浏览器)传递给它.
我的服务收到Thu Mar 01 22:33:10 IST 2012HTTP URL中的日期.由于CXF无法Date使用此String 创建对象,因此我的客户端收到404错误.我尝试ParameterHandler在服务端使用a ,但我仍然无法成功解析它,因为我不期望任何特定格式的日期.
根据这篇文章,传递一个Date应该是开箱即用,但我似乎无法让基本案例工作.我是否需要做任何事情才能成功地将Date对象从我的客户端传递给服务?感谢任何帮助.
谢谢
Per*_*ion 56
问题是JAX-RS规定参数分拆可以通过以下两种方式之一完成:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
定义您自己的参数类,它执行上面提到的逻辑.给它一个字符串构造函数或valueOf(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();
}
Run Code Online (Sandbox Code Playgroud)
或者最后,您可以为日期注册参数处理程序.其逻辑与上述其他选项的逻辑完全相同.请注意,您需要至少使用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*eis 13
Percepiton的答案非常有用,但ParameterHandler在Apache-cxf 3.0中已弃用,请参阅Apache-cxf 3.0迁移指南:
CXF JAX-RS ParameterHandler已被删除,请使用JAX-RS 2.0 ParamConverterProvider.
所以我添加一个例子ParamConverterProvider:
public class DateParameterConverterProvider implements ParamConverterProvider {
@Override
public <T> ParamConverter<T> getConverter(Class<T> type, Type type1, Annotation[] antns) {
if (Date.class.equals(type)) {
@SuppressWarnings("unchecked")
ParamConverter<T> paramConverter = (ParamConverter<T>) new DateParameterConverter();
return paramConverter;
}
return null;
}
}
public class DateParameterConverter implements ParamConverter<Date> {
public static final String format = "yyyy-MM-dd"; // set the format to whatever you need
@Override
public Date fromString(String string) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
try {
return simpleDateFormat.parse(string);
} catch (ParseException ex) {
throw new WebApplicationException(ex);
}
}
@Override
public String toString(Date t) {
return new SimpleDateFormat(format).format(t);
}
}
Run Code Online (Sandbox Code Playgroud)
将@SuppressWarnings需要在编译期间抑制"未经检查或不安全的操作"警告.有关详细信息,请参阅如何处理未选中的强制转换警告.
该ParamConverterProvider可申请为供应商.我是这样做的:
<jaxrs:server id="myService" address="/rest">
<jaxrs:serviceBeans>
...
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="dateParameterConverterProvider" />
</jaxrs:providers>
</jaxrs:server>
<bean id="dateParameterConverterProvider" class="myPackage.DateParameterConverterProvider"/>
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅Apache-cxf JAX-RS:服务配置.
| 归档时间: |
|
| 查看次数: |
61562 次 |
| 最近记录: |