今天我遇到了这个恼人的错误,花了我几个小时来解决。我在spring启动应用程序中有以下enity类
入门模型类
@Data
@Entity
@Table(name="entry")
@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true)
@AllArgsConstructor(access = AccessLevel.PUBLIC)
public class Entry {
@Id
@NotBlank
private String id;
@ManyToOne(targetEntity = User.class)
@JoinColumn(name = "username")
@NotNull
private User username;
@Enumerated(EnumType.STRING)
@NotNull
@Column(name = "type")
private Type Type;
@ManyToOne(targetEntity = Category.class)
@JoinColumn(name = "category")
@NotNull
private Category category;
@NotBlank
@Size(max = 45)
private String description;
@NotNull
private Double amount;
@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
@NotNull
private Date date;
@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
@Column(name = "lastUpdate")
@NotNull
private Date lastUpdate;
@NotNull
@Column(name = "isDeleted")
private Boolean isDeleted;
public enum Type {
Income("I"), Expense("E");
private String code;
Type(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
和一个用户模型类
@Data
@Entity
@Table(name="user")
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true)
public class User {
@Id
@Size(max = 45)
private String username;
@Size(max = 100)
private String email;
@Size(max = 60)
private String password;
private Date registeredAt;
private Date lastLoginAt;
public User(String username){
this.username = username;
this.email = "";
this.password = "";
this.registeredAt = new Date();
this.lastLoginAt = new Date();
}
}
正如您所看到的,entry类与user类有很多关系(一个用户有很多条目)。如果我从user类中删除单参数构造函数,并尝试将entry对象保存到数据库中,则会出现以下错误:
json分析错误:无法构造的示例 com.apboutos.moneytrackbackend.model.User
(尽管至少存在一个创建者):没有要从字符串值('woody')反序列化的字符串参数构造函数/工厂方法;嵌套异常为com.fasterxml.jackson.databind.exc.missmatchdinputException:无法构造的示例 com.apboutos.moneytrackbackend.model.User
(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法从[source:(pushbackinputstream)处的字符串值('woody')反序列化;行:3,列:16](通过引用链:com.apboutos.moneytrackbackend.model.entry[“username”])]
当我为用户类创建单参数构造函数并正确存储条目时,上述错误就解决了。我的猜测是,当spring试图创建entry类的示例时,它试图示例化user类,并将username字符串作为其参数传递,因为没有与该签名匹配的构造函数,所以我得到了上面的错误。
因此,我的问题是:有没有任何方法可以实现上述结果,而不必创建这个黑客式的单参数构造函数?例如,我可以将entity类中username属性的类型从user切换到string,并将该属性与user类的username属性(而不是整个类)Map为manytone关系吗?
1条答案
按热度按时间6yoyoihd1#
我想问题可能是因为:
尝试将默认构造函数公开;有时Lombok山的注解会欺骗事物。
有关详细信息,请检查以下问题:
为什么hibernate不需要参数构造函数?
使用受保护的默认构造函数时hibernate失败