lombok生成getter、setter的小陷阱

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

[color=red]以下代码为示例代码:[/color]

import lombok.Setter;
import lombok.Getter;

@Getter
@Setter
public class Member {

private String name;

private long id;

private int age;

private boolean isLeader;

@Override
public String toString() { //方便打印结果
return "Member [name=" + name + ", id=" + id + ", age=" + age
+ ", isLeader=" + isLeader + "]";
}

}


使用jackson,测试代码如下:

import org.codehaus.jackson.map.ObjectMapper;


public class JsonTest {

public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Member m = mapper.readValue("{\"name\":\"jack\",\"id\":234902348,\"age\":25,\"isLeader\":false}", mapper.constructType(Member.class));
System.out.println(m);
}

}


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

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

[img]http://dl.iteye.com/upload/attachment/0068/8386/9743bf9d-266d-30e1-a3ce-644603411fd7.jpg[/img]

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


import lombok.Setter;
import lombok.Getter;

@Getter
@Setter
public class Member {

private String name;

private long id;

private int age;

private boolean isLeader;

public void setIsLeader(boolean isLeader) { //补充一个setter
this.isLeader = isLeader;
}

@Override
public String toString() {
return "Member [name=" + name + ", id=" + id + ", age=" + age
+ ", isLeader=" + isLeader + "]";
}

}


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

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

[img]http://dl.iteye.com/upload/attachment/0068/8391/20dcc3ab-58ac-32cb-aac6-898fb08b4e4e.jpg[/img]

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

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


public class Member {

private String name;

private long id;

private int age;

private boolean isLeader;


public boolean isLeader() {
return isLeader;
}


public void setLeader(boolean isLeader) {
this.isLeader = isLeader;
}


@Override
public String toString() {
return "Member [name=" + name + ", id=" + id + ", age=" + age
+ ", isLeader=" + isLeader + "]";
}

}


可见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(),所以编码时一定要小心。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值