为了账号安全,请及时绑定邮箱和手机立即绑定

JsonIgnoreProperties 不适用于 JsonCreator 构造函数

JsonIgnoreProperties 不适用于 JsonCreator 构造函数

慕哥9229398 2021-10-28 10:45:37
我有以下实体,我将其用作对控制器的请求之一的目标 POJO:Entity@Table(name="user_account_entity")@JsonIgnoreProperties(ignoreUnknown = true)@JsonSerialize(using = UserAccountSerializer.class)public class UserAccountEntity implements UserDetails {    //...    private String username;    private String password;    @PrimaryKeyJoinColumn    @OneToOne(mappedBy= "userAccount", cascade = CascadeType.ALL, fetch = FetchType.LAZY)    private UserEntity user;    @PrimaryKeyJoinColumn    @OneToOne(mappedBy= "userAccount", cascade = CascadeType.ALL, fetch = FetchType.LAZY)    private UserAccountActivationCodeEntity activationCode;    @JsonCreator    public UserAccountEntity(@JsonProperty(value="username", required=true) final String username, @JsonProperty(value="password", required=true) final String password) {      //....    }    public UserAccountEntity() {}    //.....}当我在请求中放入意外字段时,它抛出MismatchedInputException并失败并显示以下消息:com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.myproject.project.core.entity.userAccountActivationCode.UserAccountActivationCodeEntity` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('9WL4J') at [Source: (PushbackInputStream); line: 4, column: 20] (through reference chain: com.myproject.project.core.entity.userAccount.UserAccountEntity["activationCode"])在控制器中,我有:@InitBinderpublic void binder(WebDataBinder binder) {    binder.addValidators(new CompoundValidator(new Validator[] {            new UserAccountValidator(),            new UserAccountActivationCodeDTOValidator() }));}我提出请求的端点是:@Overridepublic UserAccountEntity login(@Valid @RequestBody UserAccountEntity account,        HttpServletResponse response) throws MyBadCredentialsException, InactiveAccountException {    return userAccountService.authenticateUserAndSetResponsenHeader(            account.getUsername(), account.getPassword(), response);}
查看完整描述

1 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

触发错误是因为您在 json 中有:

"activationCode" : "9WL4J"

然而杰克逊不知道如何将字符串“9WL4J”映射到对象 UserAccountActivationCodeEntity

我猜字符串“9WL4J”是 UserAccountActivationCodeEntity 的主键 id 的值,在这种情况下,您应该在 json 中有:

"activationCode" : {"id" : "9WL4J"}

如果不是这种情况,请使用自定义 Deseralizer 来告诉 Jackson 如何将字符串映射到对象。您可以在您的实体上使用 @JsonDeserialize。


查看完整回答
反对 回复 2021-10-28
  • 1 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信