开发者社区> 问答> 正文

关于springboot同时请求时出现的对象被覆盖的问题? 400 报错

关于springboot同时请求时出现的对象被覆盖的问题? 400 报错

@Autowired private Plan plan;

@PostMapping(value="/insert",produces = "application/json;charset=UTF-8") public Message insert(@RequestBody JSONObject jsonParam) { log.info("新增流程:"+jsonParam.toJSONString()); plan = JSONObject.toJavaObject(jsonParam,Plan.class); try { if(planService.insertPlan(plan)==0){ return Message.fail(); } 。。。 }

@Component @Data public class Plan { 。。。 }

开发项目时遇到接口调用方同时有两个请求进来同一个方法,存入plan对象时,数据库报主键冲突,难道springboot自动注入的实体类在不同请求进来时 指向的是同一个对象地址吗  为什么不会自动new一个新的对象呢?

有可能是我加了注解Data、导致的吗

展开
收起
爱吃鱼的程序员 2020-05-31 00:23:57 972 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    plan不要定义为成员变量,直接局部变量即可。

    因为你 JSONObject.toJavaObject(jsonParam,Plan.class) 本身就相当于每次请求都new 一个新的对象,另外看你的代码,实际上应该是可以直接将 请求方法的参数定义为 Plan 而不是 JSONObject 。

    你的这个方式有点类似于struts的写法,但springMVC和struts是不一样的

    ######之所以不直接用对象接收,是因为接收的参数不只是plan对象的,还有其他的对象的数据,因为之前都是用公司框架开发,springboot早年学的已经忘的差不多了,这次自己写一个接口服务使用了springboot,经网友提醒才知道默认是单例的,尴尬了######

    单例。

    plan不要定义成类变量。

    为什么要加@Autowired注解?

    ######

    spring的話可以配置bean,有個參數可以表示不是單列;還有,自己new就好了,麻煩那麼多事幹嘛;

    ######

    了解下@Component吧

    ######

    实体类为啥还要加注解啊?

    ######

    new Plan()

    ######

    覆盖是因为plan是默认单例

     

    这种代码就是明显有问题的,plan应该是个实体类,你把他加载成bean,每次都new一个

    ######

    plan是单例的哦。

    ######Plan你是用于中转数据用的,你居然家了Component注解让给spring管理,加上这个你又在用的地儿通过注入获取实例,这种方式获取的实例是单列的。######

    实体类加Autowired?

    2020-05-31 00:23:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多