lombok注解@Data使用在继承类上时出现警告的问题及解决

 更新时间:2024年10月23日 10:40:36   作者:吴名氏.  
Lombok的@Data注解简化了实体类代码,但在子类中使用时会出现警告,指出equals和hashCode方法不会考虑父类属性,解决方法有两种:一是在父类上使用@EqualsAndHashCode(callSuper=true)注解;二是通过配置lombok.config文件,均能有效解决警告问题

lombok为我们提供了@Data注解,帮助我们省略了@Setter,@Getter,@ToString等注解,一般对于普通的实体类使用该注解,不会出现什么问题,但是当我们把这个注解,使用在派生类上,就出现了一个警告

1 情景再现

  • 父类:
@Data
public class BaseEntity {
 
    /**
     * 公共字段主键id
     */
    private Integer id;
 
    /**
     * 公共字段创建时间
     */
    private Date createTime;
 
    /**
     * 公共字段更新时间
     */
    private Date updateTime;
 
}
  • 子类:
@Data
public class User extends BaseEntity {
 
    /**
     * 用户名
     */
    private String username;
 
    /**
     * 密码
     */
    private String password;
 
}

此时,idea中显示,在子类的@Data注解的地方会出现警告,如图:

出现的警告信息:

Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.

大致意思是默认子类的equals和hashCode方法,不会包含或者考虑基类的属性。

我们可以通过反编译工具查看项目target/classes目录下的User.class的hashCode方法,默认情况下属性都是使用的他自身的属性。

public int hashCode()
{
    int PRIME = 59;
    int result = 1;
    Object $username = getUsername();
    result = result * 59 + ($username == null ? 43 : $username.hashCode());
    Object $password = getPassword();
    result = result * 59 + ($password == null ? 43 : $password.hashCode());
    Object $mobile = getMobile();
    result = result * 59 + ($mobile == null ? 43 :     $mobile.hashCode());
    return result;
}

2 解决方案一(添加注解)

在警告的父类加上注解@EqualsAndHashCode(callSuper=true) ,警告消失

这时候,我们再来看我们的User.class中的hashCode方法:

public int hashCode()
{
    int PRIME = 59;
    int result = super.hashCode();
    Object $username = getUsername();
    result = result * 59 + ($username == null ? 43 : $username.hashCode());
    Object $password = getPassword();
    result = result * 59 + ($password == null ? 43 : $password.hashCode());
    Object $mobile = getMobile();
    result = result * 59 + ($mobile == null ? 43 : $mobile.hashCode());
    return result;
}

可以看出代码中不一样的地方,默认情况下是int result=1,当添加注解@EqualsAndHashCode(callSuper=true)时,变成了int result=super.hashCode()。

这么一来,好像就解决了在继承情况下使用@Data注解的警告问题。

但是问题是,每一个继承的类,都需要这么来解决,也不是很方便。所以,lombok作者Roel也给出了解决办法,就是通过自定义lombok.config文件来解决。

3 解决方案二(配置lombok.config)

lombok.config文件需要放在src/main/java文件夹下的目录中(也可以放在实体同级目录下),放在src/main/resources目录下,不会生效。

下面,我们通过这种方式来解决这个警告的问题。

  • 3.1 新建lombok.config文件,然后配置:
config.stopBubbling=true
lombok.equalsAndHashCode.callSuper=call
  • 3.2 pom.xml文件中需要加入如下插件:
<plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
          <source>1.8</source>
          <target>1.8</target>
      </configuration>
</plugin>

经过上两步步骤警告已经消失,如图:

可以看到,配置生效了,然后@Data注解这里的警告也立马消失了。

4 说明

如果父类没添加@Data注解,子类如果要去掉警告的话,也需要在子类@EqualsAndHashCode(callSuper=true)注解

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解使用Spring的restTemplete进行Http请求

    详解使用Spring的restTemplete进行Http请求

    本篇文章主要介绍了详解使用Spring的restTemplete进行Http请求,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • java在文件尾部追加内容的简单实例

    java在文件尾部追加内容的简单实例

    下面小编就为大家带来一篇java在文件尾部追加内容的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Spring Cloud Eureka基础应用及原理

    Spring Cloud Eureka基础应用及原理

    这篇文章主要介绍了Spring Cloud Eureka基础应用,Eureka Client中内置一个负载均衡器,用来进行基本的负载均衡,下面我们将通过搭建一个简单的Eureka例子来了解Eureka的运作原理,感兴趣的朋友一起看看吧
    2022-05-05
  • 解决IDEA中下载free maven plugin插件无效的问题

    解决IDEA中下载free maven plugin插件无效的问题

    这篇文章主要介绍了解决IDEA中下载free maven plugin插件无效的问题,本文通过图文并茂的形式给大家分享解决方案,供大家参考,需要的朋友可以参考下
    2020-11-11
  • Java ArrayList与LinkedList使用方法详解

    Java ArrayList与LinkedList使用方法详解

    Java中容器对象主要用来存储其他对象,根据实现原理不同,主要有3类常用的容器对象:ArrayList使用数组结构存储容器中的元素、LinkedList使用链表结构存储容器中的元素
    2022-11-11
  • Spring的RedisTemplate存储的key和value有特殊字符的处理

    Spring的RedisTemplate存储的key和value有特殊字符的处理

    这篇文章主要介绍了Spring的RedisTemplate存储的key和value有特殊字符的处理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 使用Mybatis的Batch Insert Support 实现批量插入

    使用Mybatis的Batch Insert Support 实现批量插入

    这篇文章主要介绍了使用Mybatis的Batch Insert Support 实现批量插入。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Java多线程——基础概念

    Java多线程——基础概念

    这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下,希望可以帮到你
    2021-07-07
  • Java调用IK分词器进行分词方式,封装工具类

    Java调用IK分词器进行分词方式,封装工具类

    这篇文章主要介绍了Java调用IK分词器进行分词方式,封装工具类,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Springboot结合JDBC实现双数据源实例

    Springboot结合JDBC实现双数据源实例

    这篇文章主要为大家介绍了Springboot结合JDBC实现双数据源实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论