【问题标题】:Jackson deserialization - dealing with generated values with no fieldsJackson 反序列化 - 处理没有字段的生成值
【发布时间】:2018-03-23 03:54:07
【问题描述】:

我有一个简单的课程:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Endpoint.class)
public class Endpoint {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @JsonView({View.Endpoint.class, View.User.class})
    private Long id;

    @NotNull
    @NotEmpty(message = "Phone number is required.")
    @JsonView({View.Endpoint.class, View.Call.class, View.User.class})
    private String phoneNumber;

    @JsonView({View.Endpoint.class, View.Call.class, View.User.class})
    private String callerId;

    @ManyToOne(optional = false)
    @JsonView(View.Endpoint.class)
    @ApiModelProperty(hidden = true)
    private User user;

    ...

    @Override
    @JsonView({View.Endpoint.class, View.Call.class, View.User.class})
    public String getUri() {
        return EndpointController.BASE_PATH + "/" + getId();
    }

}

尝试反序列化时出现以下错误:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 无法识别的字段“uri”(类 com.example.server.telephony.endpoint.Endpoint),未标记为 可忽略(5 个已知属性:“id”、“label”、“callerId”、 "电话号码", "用户"])

由于 URI 是生成的值,因此没有要使用 @JsonIgnore 注释的字段。有什么建议可以在这种情况下做什么?

【问题讨论】:

  • 你可以考虑mix-ins
  • 尝试注释 getter 而不是字段
  • 当您使用@JsonIdentityInfo 时,@JsonView 有什么要求?!
  • @Generic 当我解析具有一对多关系的UserEndpoint 类时,我使用@JsonView 来避免循环。在不同的时间添加了这些,所以没有评估我是否需要两者。使用@JsonIdentityInfo 是否处理循环引用?
  • @JsonIdentityInfo 可以处理循环

标签: java json jackson deserialization json-deserialization


【解决方案1】:

使用 @JsonIgnoreProperties(ignoreUnknown = true) 注释您的 Endpoint

或者使用以下选项配置 ObjectMapper 以影响使用此 Mapper 反序列化的所有 POJO:

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2021-11-20
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    相关资源
    最近更新 更多