泽西岛不尊重required = true

时间:2013-07-19 14:31:05

标签: java jersey jax-rs

我有以下用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);
    }
}

如果在参数blub对象中没有设置字段作者,我期待Jersey抛出异常。但是,泽西岛似乎并不关心所需的属性。我记得它在其他项目中有效,但看不出差异。

我正在使用球衣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 个答案:

答案 0 :(得分: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);
    ...