Jersey Bean 验证将 application/x-www-form-urlencoded 解释为一个 bean
Jersey Bean Validation interpreting application/x-www-form-urlencoded as a bean
我正在使用 Jersey RESTful Web 服务框架开发 REST 服务。
需要使用 url 编码形式的内容类型并将其作为 bean interpreted/validated。
@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
此错误与 bean 验证无关。首先 application/x-www-form-urlencoded
不会像 MyBean
这样的任意类型的 MessageBodyReader
。读取可以处理的唯一类型是 Form
and MultivaluedMap
。所以只有这两种类型可以用作正文参数。
但还有另一种选择。 @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 ){ ... }
我正在使用 Jersey RESTful Web 服务框架开发 REST 服务。
需要使用 url 编码形式的内容类型并将其作为 bean interpreted/validated。
@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
此错误与 bean 验证无关。首先 application/x-www-form-urlencoded
不会像 MyBean
这样的任意类型的 MessageBodyReader
。读取可以处理的唯一类型是 Form
and MultivaluedMap
。所以只有这两种类型可以用作正文参数。
但还有另一种选择。 @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 ){ ... }