首页 > 解决方案 > 实体中的布尔字段更改 JSON 中的名称

问题描述

我的应用程序中发生了一些奇怪的事情,我想知道原因。

我在我的 Spring 服务器中有一个使用后端服务构建的资源,当 JSON 到达前端时,其中一个属性名称是不同的。我在资源的整个构造中都使用了断点,并且在返回查询之前,属性名称从未改变过isHiddenOnQuote- 正如您可能怀疑的那样,它被定义为对象模型中的布尔值。我的数据库将值存储为 1 或 0。

当我的前端收到 JSON 时,属性名称更改为hiddenOnQuote- “is”神奇地消失了。同样奇怪的是,我在 JSON 中有其他布尔字段不变;他们保留了他们的“是”。

这是模型的一个片段。请注意,超类 BaseEntity 中不存在这些属性。

package com.company.app.model.sales;

import com.company.app.model.BaseEntity;
import lombok.Data;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;

import javax.persistence.*;
import java.util.List;

@Data
@Entity
@SQLDelete(sql =
        "UPDATE product_option_category " +
                "SET is_deleted = true " +
                "WHERE id = ?")
@Where(clause = "is_deleted = false")

public class ProductOptionCategory extends BaseEntity {
    private String categoryName;

    private int optionLimit;

    private int mnSegment;

    private boolean isBitwise;

    private boolean areOptionsRepeatable = false;

    private boolean isHiddenOnQuote = false;

    public boolean getIsBitwise() {
        return isBitwise;
    }
}

这是龙目岛的事情吗?

标签: javahibernatespring-datadaolombok

解决方案


是的,Lombok 根据 Java 命名约定(https://www.comp.nus.edu.sg/~cs2103/AY1617S1/contents/coding-standards-java.html)为带有前缀“is”的原始布尔变量方法生成。我们可以用 注释该字段@Getter

@Getter
private boolean running;

Lombok 将使用它的注解处理器在类中生成一个isRunning()方法。

有时,可能会发生冲突。假设我们需要在同一个类中有以下几行:

@Getter
public boolean running = true;

@Getter
public boolean isRunning = false;

我们应该避免像这样令人困惑的命名约定有很多原因。其中之一是它为龙目岛制造了冲突。

使用 Lombok 的约定,这两个字段将具有相同的访问器方法名称:isRunning. 但是在同一个类中有两个同名的方法会产生编译错误。

Lombok 通过只创建一个访问器方法来解决这个问题,在这种情况下,它根据字段声明顺序将其指向运行。


推荐阅读