繁体   English   中英

Jersey忽略POST请求正文中无法识别的值

[英]Jersey ignores unrecognized values in POST request body

当前,当输入json对象作为POST请求的主体时,Jersey将忽略它无法识别的任何键/值对。

例:

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

当您使用杰克逊进行转换时,默认情况下,如果传递了未知参数,它实际上应该抛出异常。 我已经尝试过杰克逊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"])%

因此,如果您不受其他限制,则可以切换到杰克逊进行转换。

如果您已经在使用杰克逊,但仍然没有收到此异常,则您(或您正在使用的某些库)可能已在某处禁用了此行为。 要将其带回来,可以将以下注释添加到类TestObject

 @JsonIgnoreProperties(ignoreUnknown = false)

在反序列化此特定类的实例时,这将导致jackson为其他字段抛出异常。

要为所有对象配置此行为,您需要创建一个自定义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注册此类。

如果您使用的是gson,则可能无能为力。 支持未知属性处理程序存在一个未解决的问题,但到目前为止尚未发布。 您可以在其问题跟踪器中找到有关此问题的更多信息,包括一段代码以手动检查其他字段

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM