You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:33:19