最近做项目使用lombok生成getter和setter,代码如下:
以下代码为示例代码:
Java代码
- 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,测试代码如下:
Java代码
- 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数据转换成这个对象时出现问题,错误信息如下:
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代码
- 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是不是也是呢?如下图:
果然getter也是一样,并不是getIsLeader(),而是isLeader()。
最后,我们看看eclipse自动生成的getter和setter是什么样呢?
Java代码
- 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(),所以编码时一定要小心。