我正在使用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
答案 0 :(得分:0)
此错误与bean验证无关。对于application/x-www-form-urlencoded
这样的任意类型,MessageBodyReader
首先不是MyBean
。读取可以处理的唯一类型是Form
和MultivaluedMap
。所以这些是你可以作为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 ){ ... }