【问题标题】:FAIL_ON_UNKOWN_PROPERTIES not working as expected on Jersey POSTFAIL_ON_UNKOWN_PROPERTIES 在 Jersey POST 上没有按预期工作
【发布时间】:2016-05-03 17:11:19
【问题描述】:

使用 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 对象的字段添加到请求正文中,它们似乎会被忽略。

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

【问题讨论】:

    标签: java json rest jersey jackson


    【解决方案1】:

    使用ContextResolver,如the documentation中所述

    @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 注释选择此类

    【讨论】:

    • 如果我希望 FAIL_ON_UNKNOWN_PROPERTIES 设置为 true,是否还需要这样做?我想我记得看到这是默认设置(虽然现在找不到链接)。我还需要添加一个 ContextResolver 来将该值显式设置为 true 吗?
    • default is true - 失败
    • 感谢您的链接 - 所以考虑到它默认启用,当我使用与我的访问对象不匹配的请求正文点击此端点时,我不应该得到 JsonMappingException 吗?
    • 应该的。你确定你用的是杰克逊?你能确认杰克逊正在被使用吗?您的项目中是否还有其他可能具有优先权的提供商?和一个名称不同的@JsonProperty,看看它在序列化时是否有效。
    • 啊,我认为这是我的问题 - 看起来我们目前没有使用 Jackson。我看不出我们为什么不能这样做的任何原因,所以我会尝试添加它并从那里开始。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2017-06-29
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多