Jersey 忽略 POST 请求正文中无法识别的值
Jersey ignores unrecognized values in POST request body
目前,当输入一个 json 对象作为 POST 请求的主体时,Jersey 将忽略它无法识别的任何 key/value 对。
示例:
public class TestObject{
private String value1;
private Integer value2;
// appropriate getters and setters
}
JSON 对象:
{
"value1":"test",
"value2":1,
"value3":"wrong"
}
在上述情况下,Jersey 将接受两个预期值并创建忽略 "value3" 输入的 TestObject。
如果 JSON 对象中的任何内容无法识别,是否有办法强制 Jersey 抛出异常而不是忽略该值?
编辑:
我的控制器看起来像这样:
@POST
@Consumes("application/json")
public Response handleTestObject(TestObject testObject){
//method execution here
}
所以我依靠 Jersey 将 json 输入转换为 TestObject
当你使用jackson进行转换时,如果传递未知参数,它实际上应该默认抛出异常。我用 jackson 2.26 试过这个:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.26</version>
</dependency>
它在没有任何进一步配置的情况下抛出以下异常:
Unrecognized field "value3" (class de.jan.model.TestObject), not marked as ignorable (one known property: "test"])
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@2ff055a5; line: 1, column: 25] (through reference chain: de.jan.model.TestObject["value3"])%
因此,如果您不受任何其他限制,您可以切换到 jackson 进行转换。
如果您已经在使用 jackson 但仍未收到此异常,则您(或您正在使用的某些库)可能在某处禁用了此行为。要恢复它,您可以将以下注释添加到您的 class TestObject
:
@JsonIgnoreProperties(ignoreUnknown = false)
这将导致 jackson 在反序列化此特定 class.
的实例时为其他字段抛出异常
要为所有对象配置此行为,您需要创建自定义 ObjectMapper
解析器,如下所示:
@Provider
@Produces("application/json")
public class ObjectMapperResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperResolver() {
mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
并在您的 ResourceConfig
中注册此 class。
如果您使用的是 gson,您可能无能为力。支持未知属性处理程序有一个未解决的问题,但到目前为止还没有发布。您可以在他们的 issue tracker
中找到更多相关信息,包括用于手动检查其他字段的代码片段
目前,当输入一个 json 对象作为 POST 请求的主体时,Jersey 将忽略它无法识别的任何 key/value 对。
示例:
public class TestObject{
private String value1;
private Integer value2;
// appropriate getters and setters
}
JSON 对象:
{
"value1":"test",
"value2":1,
"value3":"wrong"
}
在上述情况下,Jersey 将接受两个预期值并创建忽略 "value3" 输入的 TestObject。
如果 JSON 对象中的任何内容无法识别,是否有办法强制 Jersey 抛出异常而不是忽略该值?
编辑:
我的控制器看起来像这样:
@POST
@Consumes("application/json")
public Response handleTestObject(TestObject testObject){
//method execution here
}
所以我依靠 Jersey 将 json 输入转换为 TestObject
当你使用jackson进行转换时,如果传递未知参数,它实际上应该默认抛出异常。我用 jackson 2.26 试过这个:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.26</version>
</dependency>
它在没有任何进一步配置的情况下抛出以下异常:
Unrecognized field "value3" (class de.jan.model.TestObject), not marked as ignorable (one known property: "test"])
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@2ff055a5; line: 1, column: 25] (through reference chain: de.jan.model.TestObject["value3"])%
因此,如果您不受任何其他限制,您可以切换到 jackson 进行转换。
如果您已经在使用 jackson 但仍未收到此异常,则您(或您正在使用的某些库)可能在某处禁用了此行为。要恢复它,您可以将以下注释添加到您的 class TestObject
:
@JsonIgnoreProperties(ignoreUnknown = false)
这将导致 jackson 在反序列化此特定 class.
的实例时为其他字段抛出异常要为所有对象配置此行为,您需要创建自定义 ObjectMapper
解析器,如下所示:
@Provider
@Produces("application/json")
public class ObjectMapperResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperResolver() {
mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
并在您的 ResourceConfig
中注册此 class。
如果您使用的是 gson,您可能无能为力。支持未知属性处理程序有一个未解决的问题,但到目前为止还没有发布。您可以在他们的 issue tracker
中找到更多相关信息,包括用于手动检查其他字段的代码片段