【问题标题】:Overriding Setter method not been invoked after lombok [duplicate]在lombok之后未调用覆盖Setter方法[重复]
【发布时间】:2019-10-25 11:39:34
【问题描述】:

我使用 Lombok 进行注释。我需要覆盖其中一个属性的 setter 方法。但这不起作用。

我已使用 @Setter(AccessLevel.NONE) 注释该属性,然后显式调用 setProperty

豆子在下面提到。

@Data
@AllArgsConstructor
@Slf4j
public class TestDto
{

    private String code;

    @Setter(AccessLevel.NONE)
    private String nameCode;

    public void setNameCode(String nameCode)
    {
        log.info("  nameCode   {}", nameCode);
        this.nameCode = <Call to some method>;
    }

}

设置 bean 列表的 DTO。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestViewDto {
    private List<TestDto> testDtoList;
    .............Few more dto's..............................
    }

这是从下面的服务调用的..

travelAgentViewDto.setTestDto(repository.findTestNumber(number);

Repository 接口定义如下:

public interface Repository extends JpaRepository<Address, AddressPk> {
        public List<TestDto> findTestNumber(String number);

}

代码运行良好。唯一的问题是当覆盖 setNameCode 时,相同的内容不会进入 setter。

来自setNameCode 方法的以下日志应打印:log.info(" nameCode {}", nameCode)

实际上电话并没有去那里。

【问题讨论】:

  • 也许 JpaRepository 正在使用您的 @AllArgsConstructor 而不是您的 setter。
  • 我认为 JPA 使用反射或其他方法将数据从 db 获取到 pojo
  • 尝试使用 delombok 查看 lombok 对您的代码做了什么,当您可能能够看到问题所在时。

标签: java spring-boot setter lombok


【解决方案1】:

正如@Ravik 提到的,您不需要明确告诉lombok 不要生成setter;你写了一个的事实意味着一个'赢',而lombok一开始就不会生成那个setter。

您没有看到 setter 被调用的原因是......因为 JPA 没有调用它。你有一个@AllArgsConstructor 注释; THAT 正在被 JPA 调用。我对JPA不太熟悉;但是,我建议您改用 @NoArgsConstructor,从而迫使 JPA 使用设置器。

【讨论】:

  • 一般来说,只要设置一个属性需要特殊处理,就到处使用特殊处理。并且不要忘记序列化……
【解决方案2】:

你不需要使用

 @Setter(AccessLevel.NONE)

由于注解会隐藏setter方法。相反,只需添加 setter 方法即可。

【讨论】:

  • 正确,但不是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多