FAIL_ON_UNKOWN_PROPERTIES在Jersey POST上无法正常工作

时间:2016-05-03 17:11:20

标签: java json rest jersey jackson

使用this post作为参考我为POST调用组合了一个简单的Jersey控制器方法,如下所示:

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response createVisit(Visit newVisit) {
    LOGGER.info("Creating visit");

    this.visits.add(newVisit);

    return Response.ok(newVisit)
            .build();
}

以下是我的Visit对象中的字段(省略了构造函数和getter / setter,因为我不认为它们在这里是相关的 - 如果它们有用,我可以添加它们):

public class Visit {
  private VisitId id;
  private AthleteId athleteId;
  private CustomerId customerId;
  private StoreId storeId;

  private Instant createdUtc;
  private Instant lastModifiedUtc;

}

当我在请求正文中传递JSON格式的有效Visit对象字段时,我看到按预期在响应中成功填充了Visit对象。但是,如果我将不属于Visit对象的字段添加到请求正文中,则它们似乎会被忽略。

我看过一些帖子试图找出如何禁用FAIL_ON_UNKNOWN_PROPERTIES属性,但我似乎遇到了相反的问题。我的理解是FAIL_ON_UNKNOWN_PROPERTIES默认为true,但是在这种情况下,当请求体中的JSON对象与我传​​入的对象不匹配时,我希望得到一个错误响应代码(500?)到我的POST方法。关于我在这里缺少什么的想法?

1 个答案:

答案 0 :(得分:1)

使用ContextResolver

中提到的@Provider public class MyObjectMapperProvider implements ContextResolver<ObjectMapper> { private final ObjectMapper mapper; public MyObjectMapperProvider() { mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } @Override public ObjectMapper getContext(Class<?> type) { return mapper; } } }
@Provider

然后你需要确保解析器已注册。如果您使用某种扫描机制来自动注册资源和提供程序,则应使用Int x = 15 Int y = 6 X %= y 注释

来选择此类。