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 ){ ... }