我有CXF休息服务,并在MyRequest中传递金额和日期。我有人过去了#abc'金额或' abc'在mydate中,然后发生一些内部cxf异常。我想让我自己的类验证amount和mydate的值并抛出我的自定义异常。可能吗?我知道在webservices中有一些数据类型适配器,但在REST中我看不到有关CXF文档的任何示例。
@POST
@Path( "/myMethod" )
void myMethod(MyRequest request);
MyRequest{
private BigDecimal amount;
private Date mydate;
//getters and setters
}
答案 0 :(得分:0)
由于您不使用任何其他框架,您将手动执行转换/验证步骤。我通常做的是接受String这样的参数,因为每个输入和输出都是最初的字符串。后来我尝试将它们转换为我需要的对象。所以我提出以下建议:
MyRequest{
private String amount;
private String mydate;
//getters and setters
}
在控制器中:
void myMethod(MyRequest request)
{
try
{
BigDecimal bigDecimalAmount = BigDecimal.valueOf(Long.parseLong(request.getAmount()));
}
catch(Exception exception
{
// handle exception
}
}
此外,如果您使用像Spring这样的框架,您可能希望了解如何实现自定义验证器。
答案 1 :(得分:0)
你有一些选择:
1-如果您有XML架构,则可以使用自定义MessageBodyReader
进行JAXB验证。见Validate JAXBElement in JPA/JAX-RS Web Service
2-您可以使用JAXB XMLAdapter
来自定义数据类型的读取方式和映射到对象的方式。见How do you specify the date format used when JAXB marshals xsd:dateTime?
您必须注释属性
@XmlRootElement
public class MyRequest{
@XmlElement(name = "mydate", required = true)
@XmlJavaTypeAdapter(DateAdapter.class)
protected Date mydate;
定义XmlAdapter
public class DateAdapter extends XmlAdapter<String, Date> {
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public String marshal(Date v) throws Exception {
synchronized (dateFormat) {
return dateFormat.format(v);
}
}
@Override
public Date unmarshal(String v) throws Exception {
synchronized (dateFormat) {
return dateFormat.parse(v);
}
}
此解决方案适用于XML数据以及使用Jackson映射器的JSON,因为支持对某些JAXB注释进行反序列化数据。见http://wiki.fasterxml.com/JacksonJAXBAnnotations
要在CXF中使用jaxb提供程序配置jackson,请参阅https://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-Jackson
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
</jaxrs:providers>