@Accessors(chain = true)注解报错的解决方案

如下所示:

Cannot invoke setItemTitle(String) on the primitive type void

定义的实体类如下:

  @Data
  public static class RefundOrderItem implements Serializable {
    /**
     * 商品标题
     */
    @JsonProperty("item_title")
    private String itemTitle;
    /**
     * 数量
     */
    private BigDecimal quantity;
    public RefundOrderItem() {
      super();
    }
    public RefundOrderItem(String itemTitle, BigDecimal quantity) {
      this.itemTitle = itemTitle;
      this.quantity = quantity;
    }
  }
}

这种写法不报错

request.getItems()
.add(new RefundOrderItem(productPO.getName(), quantity));

这种写法报错

request.getItems()
.add(new RefundOrderItem().setItemTitle(productPO.getName()).setQuantity(quantity)));

上述报错的解决方法如下:

在定义的实体类上加上注解:@Accessors(chain = true)

实体类代码如下:

@Data
  @Accessors(chain = true)
  public static class RefundOrderItem implements Serializable {
    /**
     * 商品标题
     */
    @JsonProperty("item_title")
    private String itemTitle;
    /**
     * 数量
     */
    private BigDecimal quantity;
    public RefundOrderItem() {
      super();
    }
    public RefundOrderItem(String itemTitle, BigDecimal quantity) {
      this.itemTitle = itemTitle;
      this.quantity = quantity;
    }
  }
}

lombok的@Accessors注解使用要注意

Accessors翻译是存取器。通过该注解可以控制getter和setter方法的形式。

特别注意如果不是常规的get|set,如使用此类配置(chain = true或者chain = true)。在用一些扩展工具会有问题,比如 BeanUtils.populate 将map转换为bean的时候无法使用。具体问题可以查看转换源码分析

@Accessors(fluent = true)#

使用fluent属性,getter和setter方法的方法名都是属性名,且setter方法返回当前对象

class Demo{
    private String id;
    private Demo id(String id){...}  //set
    private String id(){} //get
}

@Accessors(chain = true)#

使用chain属性,setter方法返回当前对象

class Demo{
    private String id;
    private Demo setId(String id){...}  //set
    private String id(){} //get
}

@Accessors(prefix = "f")#

使用prefix属性,getter和setter方法会忽视属性名的指定前缀(遵守驼峰命名)

class Demo{
    private String fid;
    private void id(String id){...}  //set
    private String id(){} //get
}

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

(0)

相关推荐

  • 注解@CrossOrigin解决跨域的问题

    注解@CrossOrigin 出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源.例如,当你在一个标签中检查你的银行账户时,你可以在另一个选项卡上拥有EVILL网站.来自EVILL的脚本不能够对你的银行API做出Ajax请求(从你的帐户中取出钱!)使用您的凭据. 跨源资源共享(CORS)是由大多数浏览器实现的W3C规范,允许您灵活地指定什么样的跨域请求被授权,而不是使用一些不太安全和不太强大的策略,如IFRAME或JSONP. 一.跨域(CORS)支持: Spring Framewor

  • lombok @Accessors用法详解

    @Accessors Accessor的中文含义是存取器,@Accessors用于配置getter和setter方法的生成结果,下面介绍三个属性 fluent fluent的中文含义是流畅的,设置为true,则getter和setter方法的方法名都是基础属性名,且setter方法返回当前对象.如下 @Data @Accessors(fluent = true) public class User { private Long id; private String name; // 生成的get

  • Spring @CrossOrigin 注解原理实现

    现实开发中,我们难免遇到跨域问题,以前笔者只知道jsonp这种解决方式,后面听说spring只要加入@CrossOrigin即可解决跨域问题.本着好奇的心里,笔者看了下@CrossOrigin 作用原理,写下这篇博客. 先说原理:其实很简单,就是利用spring的拦截器实现往response里添加 Access-Control-Allow-Origin等响应头信息,我们可以看下spring是怎么做的 注:这里使用的spring版本为5.0.6 我们可以先往RequestMappingHandle

  • @Accessors(chain = true)注解报错的解决方案

    如下所示: Cannot invoke setItemTitle(String) on the primitive type void 定义的实体类如下: @Data public static class RefundOrderItem implements Serializable { /** * 商品标题 */ @JsonProperty("item_title") private String itemTitle; /** * 数量 */ private BigDecimal

  • mybatis不加@Parm注解报错的解决方案

    我的idea版本2017.3.4,低版本貌似不会加上这个配置,idea高版本会 补充知识:Mybatis传多个参数的问题 及MyBatis报错 Parameter '0' not found. Available parameters are [arg1, arg0, param1 问题 对于使用Mybatis ,传多个参数,我们可以使用对象封装外,还可以直接传递参数 对象的封装,例如查询对象条件basequery对象 <select id="getProductByProductQuer

  • Mybatis Mapper中多参数方法不使用@param注解报错的解决

    目录 问题描述 寻求解决方案 寻找原因 拓展延伸 在使用低版本的Mybatis的时候,Mapper中的方法如果有多个参数时需要使用@param注解,才能在对应xml的sql语句中使用参数名称获取传入方法的参数值,否则就会报错.本文结合自身在真实开发环境中使用IDEA开发时遇到的问题来共同探讨一下不使用@Param注解报错背后的原因以及解决方案. 问题描述 最近使用IDEA进行开发,项目使用SpringBoot+Mybatis3.4.6,同样的代码检出到本地IDEA后运行,在一个业务查询模块报错,

  • Django migrate报错的解决方案

    前言 在讲解如何解决migrate报错原因前,我们先要了解migrate做了什么事情,migrate:将新生成的迁移脚本.映射到数据库中.创建新的表或者修改表的结构. 问题1:migrate怎么判断哪些迁移脚本需要执行? 它会将代码中的迁移脚本和数据库中django_migrations中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移脚本. 问题2:migrate做了什么事情 将相关的迁移脚本翻译成SQL语句,在数据库中执行这个SQL语句. 如果这个SQL语句执行没

  • SpringDataJpa的@Query注解报错的解决

    目录 SpringDataJpa @Query注解报错 SpringDataJpa @query注解使用原生代码报错 SpringDataJpa @Query注解报错 public interface TimeContentRepository extends JpaRepository<TimeContent,String> { @Query(value = "select id,user_id as userId,create_time as createTime "

  • SpringBoot集成MybatisPlus报错的解决方案

    这篇文章主要介绍了SpringBoot集成MybatisPlus报错的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题 启动的时候总是报如下错误: java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class 解决方案 需要一个mybatis-spring-boot-starter的包,在pom文件加上之后,完

  • 启动springboot应用因未配置数据库报错的解决方案

    目录 启动springboot应用因未配置数据库报错 描述 解决方案 springboot 1.5.8.RELEASE 版本启动报错 起因 错误排查 解决方法 启动springboot应用因未配置数据库报错 描述 创建一个全新的springboot项目,第一次启动时报错,具体错误信息如下所示: Error starting ApplicationContext. To display the conditions report re-run your application with 'debu

  • Maven依赖junit @Test报错的解决方案

    目录 Maven依赖junit@Test报错 现象 解决方案 idea添加junit的maven依赖后,使用@Test.@Before.@After仍报错 maven中的依赖配置如下 Maven依赖junit @Test报错 现象 解决方案 测试文件夹标记使用错啦,test 表示junit的jar包只能在标记为 Test Sources Root 的文件夹下被调用,调整一下就OK了 如下图: idea添加junit的maven依赖后,使用@Test.@Before.@After仍报错 一般该问题

  • mybatis中使用InsertProvider注解报错解决全过程

    目录 使用InsertProvider注解报错解决 mybatis注解开发@InsertProvider Userprovider类 mapper的书写 使用InsertProvider注解报错解决 目前项目在使用mybatis,并且是使用注解的方式. 在使用InsertProvider注解的时候报了一下的错误: org.apache.ibatis.builder.BuilderException: Could not find value method on SQL annotation.  

  • npm i报错以及解决方案实战案例

    目录 报错案例1 报错案例2 报错案例3 报错案例4 报错案例5 总结 报错案例1 npm ERR! Cannot read properties of null (reading 'pickAlgorithm') 解决方案:清理缓存后再次安装 npm cache clear --force 报错案例2 npm ERR! gyp info it worked if it ends with ok ... npm ERR! gyp ERR! cwd C:\...\node_modules\node

随机推荐