2016-04-21 63 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>