验证RestService CXF 3中的数量和日期,jaxrs

时间:2016-12-20 16:11:13

标签: jax-rs cxf

我有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
}

2 个答案:

答案 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>
相关问题