ombok生成getter、setter的小陷阱

最近做项目使用lombok生成getter和setter,代码如下: 

以下代码为示例代码: 

Java代码 

 收藏代码

  1. import lombok.Setter;  
  2. import lombok.Getter;  
  3.   
  4. @Getter  
  5. @Setter  
  6. public class Member {  
  7.   
  8.     private String name;  
  9.       
  10.     private long id;  
  11.       
  12.     private int age;  
  13.       
  14.     private boolean isLeader;  
  15.   
  16.     @Override  
  17.     public String toString() { //方便打印结果  
  18.         return "Member [name=" + name + ", id=" + id + ", age=" + age  
  19.                 + ", isLeader=" + isLeader + "]";  
  20.     }  
  21.       
  22. }  



使用jackson,测试代码如下: 

Java代码 

 收藏代码

  1. import org.codehaus.jackson.map.ObjectMapper;  
  2.   
  3.   
  4. public class JsonTest {  
  5.       
  6.     public static void main(String[] args) throws Exception {  
  7.         ObjectMapper mapper = new ObjectMapper();  
  8.         Member m = mapper.readValue("{\"name\":\"jack\",\"id\":234902348,\"age\":25,\"isLeader\":false}", mapper.constructType(Member.class));  
  9.         System.out.println(m);  
  10.     }  
  11.   
  12. }  



结果将json数据转换成这个对象时出现问题,错误信息如下: 
Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "isLeader" (Class Member), not marked as ignorable 

提示说isLeader这个property没有找到,但是明明是存在的。这时想到转换对象时,是通过setter将值set给每一个property的,会不会是因为setter不对导致找到property呢?查看一下生成setter,果然发现问题,如下图: 

 

property的名称是isLeader,根据规则,生成的setter应该是setIsLeader(),但是实际却是setLeader(),问题应该就出在这里了,那么修改下Member的代码,来验证下我们的猜测,如下: 
 

Java代码 

 收藏代码

  1. import lombok.Setter;  
  2. import lombok.Getter;  
  3.   
  4. @Getter  
  5. @Setter  
  6. public class Member {  
  7.   
  8.     private String name;  
  9.       
  10.     private long id;  
  11.       
  12.     private int age;  
  13.       
  14.     private boolean isLeader;  
  15.       
  16.     public void setIsLeader(boolean isLeader) { //补充一个setter  
  17.         this.isLeader = isLeader;  
  18.     }  
  19.       
  20.     @Override  
  21.     public String toString() {  
  22.         return "Member [name=" + name + ", id=" + id + ", age=" + age  
  23.                 + ", isLeader=" + isLeader + "]";  
  24.     }  
  25.   
  26. }  



重新运行测试,问题不再出现,和猜测一样,是由于生成setter不规范导致的。 

既然setter生成的不规范,那么getter是不是也是呢?如下图: 

 

果然getter也是一样,并不是getIsLeader(),而是isLeader()。 

最后,我们看看eclipse自动生成的getter和setter是什么样呢? 
 

Java代码 

 收藏代码

  1. public class Member {  
  2.   
  3.     private String name;  
  4.       
  5.     private long id;  
  6.       
  7.     private int age;  
  8.       
  9.     private boolean isLeader;  
  10.       
  11.       
  12.     public boolean isLeader() {  
  13.         return isLeader;  
  14.     }  
  15.   
  16.   
  17.     public void setLeader(boolean isLeader) {  
  18.         this.isLeader = isLeader;  
  19.     }  
  20.   
  21.   
  22.     @Override  
  23.     public String toString() {  
  24.         return "Member [name=" + name + ", id=" + id + ", age=" + age  
  25.                 + ", isLeader=" + isLeader + "]";  
  26.     }  
  27.   
  28. }  



可见eclipse生成的getter、setter和lombok是一样的,但是eclipse生成的代码是显示的,可以看见,而lombok生成就不容易发现了。 

最后说一下boolean型生成getter和setter的问题,如果boolean型property的名称是hello,b生成getter和setter的格式是isHello()和getHello(),如果名称是isHello,生成的还是isHello()和getHello(),这个是sun的规范,但是目前很多框架在使用getter和setter时并不是这样的,而是setHello ()或者setIsHello(),所以编码时一定要小心。

猜你喜欢

转载自blog.csdn.net/Architect_CSDN/article/details/90046628
今日推荐