2016-04-21 68 views
0

我尝试使用JAX-B对象作为参数来验证JAX-RS请求。使用JAX-B对象作为参数验证JAX-RS请求

代码:

JAX-B模型类:

@XmlRootElement(namespace = "http://www.test.com/test") 
@XmlAccessorType(value = XmlAccessType.FIELD) 
public class TestModel { 

    @XmlElement(required = true) 
    private String id; 

    @XmlElement 
    private String name; 
} 

JAX-RS资源类:

@Path("test") 
public class TestResource { 

    @POST 
    @Consumes({ MediaType.APPLICATION_XML, MediaType.TEXT_XML }) 
    public void create(TestModel testModel) { 
     // some code 
    } 
} 

CXF配置:

<jaxrs:server address="/rest" id="test" staticSubresourceResolution="true"> 
    <jaxrs:serviceBeans> 
     <ref bean="testResource" /> 
    </jaxrs:serviceBeans> 
    <jaxrs:providers> 
     <bean class="org.apache.cxf.jaxrs.provider.JAXBElementProvider" /> 
    </jaxrs:providers> 
</jaxrs:server> 

例子:

请求正文:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:testModel xmlns:ns2="http://www.test.com/test"> 
    <name>testName</name> 
</ns2:testModel> 

id丢失,所以我应该得到一个HTTP status 400,但我得到HTTP status 204

研究:

我发现Schema validation

  1. 使用JAXRS:schemaLocations元件

[...]

  • 配置提供RS单独
  • [...]

  • 使用SchemaValidation注释
  • ,但我不XSD文件(仅JAX-B类) 。

    有没有办法验证没有XSD文件的JAX-B对象?

    +1

    如果您使用CXF 3.x中,它支持[豆验证](http://cxf.apache.org/docs/jax-rs.html#JAX-RS-BeanValidation)。太糟糕的文档链接是一个死链接。我不使用CXF,所以我无法帮助你配置这个 –

    回答

    0

    一个坏的解决方法是生成XSD文件与Maven:

    <plugin> 
        <groupId>org.codehaus.mojo</groupId> 
        <artifactId>jaxb2-maven-plugin</artifactId> 
        <version>2.2</version> 
        <executions> 
         <execution> 
          <goals> 
           <goal>schemagen</goal> 
          </goals> 
          <phase>generate-resources</phase> 
          <configuration> 
           <includes> 
            <include>*.java</include> 
           </includes> 
           <outputDirectory>${basedir}/src/main/resources/</outputDirectory> 
          </configuration> 
         </execution> 
        </executions> 
    </plugin> 
    

    和XSD文件添加到CXF配置:

    <jaxrs:schemaLocations> 
        <jaxrs:schemaLocation>classpath:schema1.xsd</jaxrs:schemaLocation> 
        <jaxrs:schemaLocation>classpath:schema2.xsd</jaxrs:schemaLocation> 
    </jaxrs:schemaLocations>