Spring Boot 2.7.4报错:找不到类的主构造函数或唯一构造函数
解决Spring 2.7.4中"No primary or unique constructor found for class..."报错
报错原因
Spring Data JPA实例化Cliente实体类时,发现存在多个带参数的构造函数,无法自动确定使用哪一个创建实例,因此抛出该错误。JPA规范要求实体类需提供无参构造,或明确标记出主构造函数供Spring识别。
解决方案
方案1:添加无参构造函数
这是最通用的解决方式,直接在Cliente类中添加无参构造:
public class Cliente { // 你的字段定义... // 添加无参构造函数 public Cliente() { super(); } // 原有带参构造函数1 public Cliente(@NotEmpty @Pattern(regexp = "^[A-Z][a-zA-Z]+") String userName, @NotEmpty String email, @NotEmpty String contraseña) { this.userName = userName; this.email = email; this.contraseña = contraseña; } // 原有带参构造函数2 public Cliente(String productosCliente, @NotEmpty @Pattern(regexp = "^[A-Z][a-zA-Z]+") String userName, @NotEmpty String segundoNombre, @NotEmpty String primerApellido, @NotEmpty String segundoApellido, @NotEmpty String ciudadCliente, @NotEmpty String direccionCliente, @NotEmpty String email, @NotEmpty String contraseña, @NotNull @Past Date fechaNacimiento, @NotNull Set<Role> roles) { this.productosCliente = productosCliente; this.userName = userName; this.segundoNombre = segundoNombre; this.primerApellido = primerApellido; this.segundoApellido = segundoApellido; this.ciudadCliente = ciudadCliente; this.direccionCliente = direccionCliente; this.email = email; this.contraseña = contraseña; this.fechaNacimiento = fechaNacimiento; this.roles = roles; } }
方案2:标记主构造函数(使用@ConstructorProperties)
若不想添加无参构造,可通过@ConstructorProperties注解指定Spring优先使用的主构造函数,示例如下:
import java.beans.ConstructorProperties; public class Cliente { // 你的字段定义... @ConstructorProperties({"userName", "email", "contraseña"}) public Cliente(@NotEmpty @Pattern(regexp = "^[A-Z][a-zA-Z]+") String userName, @NotEmpty String email, @NotEmpty String contraseña) { this.userName = userName; this.email = email; this.contraseña = contraseña; } // 原有带参构造函数2... }
方案3:使用Lombok简化(可选)
如果项目依赖Lombok,可通过注解自动生成构造函数,减少手写代码:
import lombok.NoArgsConstructor; @NoArgsConstructor // 自动生成无参构造 public class Cliente { // 你的字段定义... // 原有带参构造函数1... // 原有带参构造函数2... }
额外说明
你Controller中手动通过构造函数创建Cliente实例的逻辑是正常的,报错触发点是Spring Data JPA执行数据库操作(如查询、持久化)时反射实例化实体的过程,只需解决构造函数的歧义问题即可。
内容的提问来源于stack exchange,提问作者Toms_Hd3z
相关产品推荐
相关产品推荐

