Spring Boot 3.2.4创建查询排序选项时触发异常问题
问题描述
我尝试用以下代码创建排序规则:
Sort.TypedSort<User> sortBy = Sort.sort(User.class); Sort sort = sortBy.by(User::getFirstname).and(sortBy.by(User::getLastname));
调试时抛出以下异常:
Method threw 'java.lang.IllegalArgumentException' exception. Cannot evaluate org.springframework.data.util.MethodInvocationRecorder$Recorded.toString()
同时还有:
Method threw 'java.lang.IllegalArgumentException' exception. Cannot evaluate org.example.spring.database.entity.User$$SpringCGLIB$$0.toString()
我的User实体代码如下:
package org.example.spring.database.entity; import jakarta.persistence.*; import lombok.*; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; @NamedEntityGraph( name = "User.company", attributeNodes = @NamedAttributeNode("company")) @Data @NoArgsConstructor @AllArgsConstructor @Builder @Entity @Table(name = "users") @ToString(exclude = {"userChats", "company"}) @EqualsAndHashCode(of = "username") public class User implements BaseEntity<Long> { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long Id; @Column(unique = true, nullable = false) private String username; private LocalDate birthDate; @Column(name = "firstname") private String firstname; @Column(name = "lastname") private String lastname; @Enumerated(EnumType.STRING) private Role role; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "company_id") private Company company; @Builder.Default @OneToMany(mappedBy = "user") private List<UserChat> userChats = new ArrayList<>(); }
我已经把userChats和company排除在toString()方法外,但问题依然存在。
解决方案
这个异常是Spring Data TypedSort生成CGLIB代理类时,调用toString()触发的冲突问题,结合你的代码,可尝试以下几种解决方式:
1. 改用非类型安全的Sort构造方式
直接通过字段名创建Sort,绕开代理类的问题:
Sort sort = Sort.by("firstname", "lastname");
这种方式简单直接,避免了TypedSort生成代理时的toString逻辑冲突。
2. 调整Lombok的@ToString配置,显式指定包含字段
避免使用exclude,改用of明确指定需要包含的字段,减少代理类处理时的潜在问题:
@ToString(of = {"Id", "username", "birthDate", "firstname", "lastname", "role"})
注意:建议将实体中的Id字段改为小写id,符合Java驼峰命名规范,避免后续其他潜在问题。
3. 显式指定无参构造方法的访问权限
虽然已经添加@NoArgsConstructor,但显式声明为public可确保Spring生成CGLIB代理时能正常实例化:
@NoArgsConstructor(access = AccessLevel.PUBLIC)
4. 检查Role枚举类的toString实现
异常也可能和Role枚举的toString()逻辑有关,如果枚举有自定义实现,确保它不会抛出异常,或者恢复为默认的枚举toString行为。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

