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);
    }
}

如果在参数 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>

提前致谢

问候莱昂

4

1 回答 1

1

Jersey 使用 JAXB 进行编组和解组,这意味着将数据转换为 Java 对象。如果你想验证你必须自己做

为此提出的解决方案包括创建一个自定义MessageBodyReader以添加对解组的验证或通过编写本文所述的自定义来创建更可重用的实现ContextResolverJersey JAX-RS 和 JAXB 模式验证。

JSR303支持对于这类事情来说是理想的(与 JSON 数据很好地工作),但看起来这将仅在 2.x中可用。不过,应该可以调整上述帖子中的解决方案并使用 JSR303。

如果实现变得太复杂,您总是可以让 Jersey 创建对象,然后首先在对象上调用您的一些验证方法,通常不应该超过一个衬里,例如:

@Path("/createBlub")
@POST
public ReplyObject createBlub(Blub blub) {
    ValidationUtils.<Blub>validate(blub);
    ...
于 2013-07-21T20:24:48.777 回答