Jersey Bean Validation将application / x-www-form-urlencoded解释为bean

时间:2015-09-16 20:22:40

标签: java rest jersey javabeans

我正在使用Jersey RESTful Web服务框架开发REST服务。

需要使用url编码的表单content-type并将其解释/验证为bean。

@POST @Path("put")
@Consumes("application/x-www-form-urlencoded")
@NotNull (message="Couldn't put this bean in the can, sorry")
public Response putABean( @Valid final MrBean bean ){ ... }
@XmlRootElement
public class MrBean {

@DecimalMin(value = "18" , message= "value must be at least 18")
@DecimalMax(value = "99" , message= "value must at most be 99")
@NotNull(message = "{null.generic}")
private Long age;

@NotNull(message = "{null.name.first}")
private String firstName;

@NotNull(message = "{null.name.last}")
private String lastName;

@Pattern(regexp="[0-9]{3,9}", message="{invalid.phone}")
@NotNull(message = "{null.generic}")
private String phone;

...

}

当资源使用application / json或application / xml时,这是可能的,但在application / x-www-form-urlencoded的情况下,我收到'415 - 不支持的媒体类型'响应。

我的理解是,这不是开箱即用的,并且需要注册的功能类似于在此处完成的功能: https://jersey.java.net/documentation/latest/media.html

1 个答案:

答案 0 :(得分:0)

此错误与bean验证无关。对于application/x-www-form-urlencoded这样的任意类型,MessageBodyReader首先不是MyBean。读取可以处理的唯一类型是FormMultivaluedMap。所以这些是你可以作为body参数的唯一两种类型。

但还有另一种选择。 @BeanParam注释允许您创建一个bean来组合任意@XxxParam带注释的元素,如@FormParam@PathParam@QueryParam@HeaderParam等所以,如果您知道提交表单中的预期密钥,您可以执行类似

的操作
public class MrBean {

    // validation annotations
    @FormParam("key1")
    private String value1;

    // validation annotations
    @FormParam("key2")
    private String value2;

    // getters setters
}

然后你可以做

public Response putABean( @Valid @BeanParam MrBean bean ){ ... }