2013-07-19 21 views
2

我有以下類JAX-RS註釋:澤西不接受必需=真

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Blub { 
    @XmlElement (required = true) 
    private String author; 

用的getter/setter方法和。我使用這個對象作爲參數的方法:

@Path("/createBlub") 
@POST 
public ReplyObject createBlub(Blub blub) { 
    try { 
     ... 
     //process here 
      return ReplyObject.success("blub", result); 
    } catch (Exception e) { 
     throw new WebApplicationException(e); 
    } 
} 

我期待新澤西拋出一個異常,如果在參數咕嚕對象現場筆者未設置。然而,澤西似乎並不在乎所需的屬性。我記得它在其他項目中有效,但沒有看到區別。

我用的球衣1.12沒有別的:

 <servlet> 
      <servlet-name>JerseyServletContainerAdmin</servlet-name> 
      <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 

      <init-param> 
        <param-name>com.sun.jersey.config.property.packages</param-name> 
        <param-value>xxx.yyy.zzz.admin</param-value> 
      </init-param> 
      <init-param> 
        <param-name>com.sun.jersey.config.feature.DisableXmlSecurity 
        </param-name> 
        <param-value>true</param-value> 
      </init-param> 
      <init-param> 
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
        <param-value>true</param-value> 
      </init-param> 
      <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
      <servlet-name>JerseyServletContainerAdmin</servlet-name> 
      <url-pattern>/admin/*</url-pattern> 
    </servlet-mapping> 

在此先感謝

問候 萊昂

回答

1

澤西使用JAXB用於編組和解組這只是意味着transforming the data into a Java object. If you want validation you have to do it yourself

對於提出的解決方案包括:creating a custom MessageBodyReader to add the validation on unmarshalling或在這篇文章中描述編寫自定義ContextResolver創造更重用實現:Jersey JAX-RS and JAXB Schema Validation.

JSR303支持將是非常適合這樣的事情(使用JSON數據很好地工作)但看起來像將是available only in 2.x。應該有可能調整上述文章的解決方案並使用JSR303。

如果實現過於複雜,你可以讓Jersey創建對象,然後首先在對象上調用你的驗證方法,這通常不應該超過一個班輪,就像:

@Path("/createBlub") 
@POST 
public ReplyObject createBlub(Blub blub) { 
    ValidationUtils.<Blub>validate(blub); 
    ...