java - Jersey 不遵守 required=true

标签 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 抛出异常。但是,Jersey 似乎并不关心 required 属性。我记得它在其他项目中有效,但看不出有什么不同。

我只使用 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>

提前致谢

问候 里昂

最佳答案

Jersey 正在使用 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);
    ...

关于java - Jersey 不遵守 required=true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17748681/

相关文章:

Java 循环故障排除

java - 使我的所有 ajax 响应不可缓存的简单方法

web-services - 启用内容类型协商时,JAXRS RESTful 服务是否容易受到 CSRF 攻击?

jersey - 如何从 ContainerResponseFilter 内部获取源地址/ip

java - 在 Java REST API 中注入(inject) ContainerRequestFilter

java - 如何通过内部方法更改对象的值?

java - 如何将我的第一个程序提交到SPOJ平台?为什么我收到超出时间限制或运行时错误 NZEC?

java - 未调用 Jersey ExceptionMapper

android - 正确的 Android REST 客户端

java - 用户登录Domino后如何获取邮件nsf文件名