【问题标题】:Boolean field in entity changes name in JSON实体中的布尔字段更改 JSON 中的名称
【发布时间】:2020-12-28 03:12:06
【问题描述】:

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

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

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

这是模型中的一个 sn-p。请注意,超类 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;
    }
}

这是龙目岛的事吗?

【问题讨论】:

    标签: java hibernate spring-data dao lombok


    【解决方案1】:

    如果 isBitwise 运行良好但 isHiddenOnQuote 运行不佳,您可能遇到了错误。

    另外,请注意您没有使用 Lombok 中的 @Getter 等注释。也许您可以尝试使用以下注释来强制使用正确的名称:

    @get:JsonProperty("isHiddenOnQuote")

    @param:JsonProperty("isHiddenOnQuote")

    我从 Stackoverflow 上的这个答案中得到了这个: https://stackoverflow.com/a/55100741/4402505

    编辑:修正了属性名称。

    【讨论】:

    • 太棒了!谢谢
    • 只是为了清楚起见,看起来这不是一个错误。抱歉,我有一个用于 isBitwise 字段的 getter 函数,我没有包含它,因为它似乎不相关。现在我知道杰克逊会使用这种方法进行序列化。
    【解决方案2】:

    是的,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 通过只创建一个访问器方法解决了这个问题,在这种情况下,根据字段声明顺序将其指向运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多