IntelliJ / Lombok 乱用 "is" 前缀并将其删除

IntelliJ / Lombok messing around with "is" prefix and removing it

我不知道发生了什么,但出于某种原因,我的 属性 中的 is 前缀正在被删除。

我什至从 Lombok 中删除了注释并手动创建了 getter 和 setter 但是由于某种原因,我得到了这个奇怪的错误。

我有一个名为 isAuthenticated 的道具,它必须 return 到浏览器,出于某种原因,我正在接受身份验证。

代码如下: //终点在API: @GetMapping("/auth") publicEmployeeState getEmployeeState(HttpServletRequest 请求){ return employeeService.getEmployeeState(request.getSession()); }

服务方法:

public EmployeeState getEmployeeState(HttpSession session) {

        EmployeeState employeeState = new EmployeeState();
        employeeState.setIsAuthenticated(SecurityContextHolder.getContext().getAuthentication().isAuthenticated());

        if (employeeState.isAuthenticated()){
            if (session.getAttribute("employeeNumber") != null){
                Employee employee = employeeRepository.getEmployeeByEmployeeNumber(session.getAttribute("employeeNumber").toString()).get();
                employeeState.setFirstName(employee.getFirstName());
                employeeState.setLastName(employee.getLastName());
                employeeState.setEmployeeNumber(employee.getEmployeeNumber());
            }
        }

        return employeeState;
    }

这是模型,响应应该是 return:

public class EmployeeState {

    private String firstName;
    private String lastName;
    private String employeeNumber;
    private boolean isAuthenticated;

    public EmployeeState(){

    }

    public EmployeeState(String firstName, String lastName, String employeeNumber, boolean isAuthenticated) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.employeeNumber = employeeNumber;
        this.isAuthenticated = isAuthenticated;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmployeeNumber() {
        return employeeNumber;
    }

    public void setEmployeeNumber(String employeeNumber) {
        this.employeeNumber = employeeNumber;
    }

    public boolean isAuthenticated() {
        return isAuthenticated;
    }

    public void setIsAuthenticated(boolean authenticated) {
        isAuthenticated = authenticated;
    }
}

浏览器中的结果:

编辑 1:

我尝试添加@JsonProperty 注解,现在我得到了两个属性:

public class EmployeeState {

    private String firstName;
    private String lastName;
    private String employeeNumber;

    @JsonProperty(value = "isAuthenticated")
    private boolean isAuthenticated;

    public EmployeeState(){

    }

    public EmployeeState(String firstName, String lastName, String employeeNumber, boolean isAuthenticated) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.employeeNumber = employeeNumber;
        this.isAuthenticated = isAuthenticated;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmployeeNumber() {
        return employeeNumber;
    }

    public void setEmployeeNumber(String employeeNumber) {
        this.employeeNumber = employeeNumber;
    }

    public boolean isAuthenticated() {
        return isAuthenticated;
    }

    public void setIsAuthenticated(boolean authenticated) {
        isAuthenticated = authenticated;
    }
}

现在有两个属性:

您的 getter 方法的正确 Java Bean 命名约定是 isIsAuthenticated。 Jackson 尝试使用 Java bean 约定,在这种情况下,您的 class 不符合它。您可以尝试直接在 isAuthenticated 方法上添加 @JsonProperty(value = "isAuthenticated") 注释。此外,为了防止 JSON 中的任何重复字段,如果您不需要从 JSON 序列化该字段,则可以在 isAuthenticated 字段上添加 @JsonIgnore

为什么现在 JSON 中有 2 个字段的小解释:

Jackson 从您的 isAuthenticated() 方法中得出的正确 属性 名称是 authenticated。 属性 名称的派生使得 getter 前缀(对于布尔方法是 is)被删除,并且后面的字母转换为小写)。这就是为什么您会看到 JSON 属性 authenticated.

此外,Jackson 看到了您的 isAuthenticated 字段,并为其创建了一个 JSON 属性,然后将其命名为 isAuthenticated。通过在字段本身上添加 @JsonProperty 注释,Jackson 没有任何变化,因为对于 Jackson 而言,isAuthenticated() 方法与字段和 setter 方法完全没有关系,因此它们被处理作为两个不同的 JSON 属性。