searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

JAVA后端开发遇到的问题随记

2023-07-24 06:01:33
3
0

1. 调用HTTP请求问题:java端通过url调用get请求获取json结果并反序列化获取json字段信息示例

@GetMapping("")
public Object doJob() {
    log.info("started the job item: Storage DW-ST-9 ");

    String forObject = restTemplate.getForObject("http://xxxx/query?pageIndex=1&pageSize=5&status=&name=&groupID=1", String.class);



    System.out.println(forObject);
    JSONObject jsonObject = JSONObject.parseObject(forObject);
    JSONArray data = jsonObject.getJSONArray("data");
    System.out.println(data);
    for (int i = 0; i < data.size(); i++) {
        String currentName = data.getJSONObject(i).getString("name");
        System.out.println(currentName);
    }
 

java端通过url调用get请求获取json结果并反序列化获取json字段信息示例

 

2. Springboot+Websocket中@Autowired注入service为null的解决方法

多个解决方案原文链接:https://blog.csdn.net/weixin_45698637/article/details/118684875

 

问题:在开发过程中,用mq消费者写了一个websocket,并且处理消息队列信息时有对bean的操作,在用了各种方法service都是注入不进去。发现应该是Spring默认对bean的管理都是单例(singleton),和 websocket (多对象)相冲突。该对象的 service 不是 null,被成功注入。但是,由于 spring 默认管理的是单例,所以只会注入一次 service。当用户建立新的连接时,系统又会创建一个新的 websocket 对象,这时不会再次注入了,所以导致只要是用户连接创建的 websocket 对象,都不能再注入了,后面的注入均为null

解决方法

使用静态变量,加set注入

@Slf4j
@Component //关键点:component注入
@Service
public class RabbitConsumer {

    private static OrderServiceImpl orderService; //关键点:注册为静态方法

    @Autowired  //关键点:利用autowired将service注入
    public void setOrderService (OrderServiceImpl orderService){
        RabbitConsumer.orderService = orderService;
    }

 

3. 为什么Controller层注入的是Service接口,而不是ServiceImpl实现类

错误代码:

Service层
    接口
    interface PCI{}
接口实现类
    @Service
    class PCIImpt imeplements PCI{}
 
Controller层
    @Autowired
    private PCIImpt pciImpt;    //注入了实现类

在没有使用maven管理的时候注入实现类编译一直未报错,也就是说编译可以通过,但是使用maven管理后,编译报错。 而正确的写法:

Controller层
    @Autowired
    private PCI pci;    //注入接口以Autowired自动接收

结果:编译通过;

 

结论就是:注入的是实现类对象,接收的接口;理解为多态;(Controller–Service–ServiceImpt–Mapper)

要遵循Controller–Service接口–ServiceImpt实现类–Mapper接口模式

那么在Service接口有多个ServiceImpt实现类的情况,就需要指定参数名来选择哪个ServiceImpt实现类了。

Service层(此时有两个接口实现类)
    @Service("PCIImpt1")
    class PCIImpt1 imeplements PCI{}
​
@Service("PCIimpt2")
class PCIImpt2 imeplements PCI{}
​
Controller层
    @Resource(name="PCIimpt2")  //填PCIimpt1,注入PCIimpt1实现类,填PCIimpt2,则注入PCIimpt2实现类
    private PCI pci;    //注入接口以Resource手动指定接收

同理:在ServiceImpt实现类中也是通过Mapper接口来接收;即:

ServiceImpt实现类
    @Autowired
    private Mapper mapper;

 

以上就是开发中遇到一些困惑和问题,举例不多但个人水平有限解决时间较长后总结的问题,希望后续大家多多分享交流。

0条评论
0 / 1000
黄****辰
3文章数
0粉丝数
黄****辰
3 文章 | 0 粉丝
黄****辰
3文章数
0粉丝数
黄****辰
3 文章 | 0 粉丝
原创

JAVA后端开发遇到的问题随记

2023-07-24 06:01:33
3
0

1. 调用HTTP请求问题:java端通过url调用get请求获取json结果并反序列化获取json字段信息示例

@GetMapping("")
public Object doJob() {
    log.info("started the job item: Storage DW-ST-9 ");

    String forObject = restTemplate.getForObject("http://xxxx/query?pageIndex=1&pageSize=5&status=&name=&groupID=1", String.class);



    System.out.println(forObject);
    JSONObject jsonObject = JSONObject.parseObject(forObject);
    JSONArray data = jsonObject.getJSONArray("data");
    System.out.println(data);
    for (int i = 0; i < data.size(); i++) {
        String currentName = data.getJSONObject(i).getString("name");
        System.out.println(currentName);
    }
 

java端通过url调用get请求获取json结果并反序列化获取json字段信息示例

 

2. Springboot+Websocket中@Autowired注入service为null的解决方法

多个解决方案原文链接:https://blog.csdn.net/weixin_45698637/article/details/118684875

 

问题:在开发过程中,用mq消费者写了一个websocket,并且处理消息队列信息时有对bean的操作,在用了各种方法service都是注入不进去。发现应该是Spring默认对bean的管理都是单例(singleton),和 websocket (多对象)相冲突。该对象的 service 不是 null,被成功注入。但是,由于 spring 默认管理的是单例,所以只会注入一次 service。当用户建立新的连接时,系统又会创建一个新的 websocket 对象,这时不会再次注入了,所以导致只要是用户连接创建的 websocket 对象,都不能再注入了,后面的注入均为null

解决方法

使用静态变量,加set注入

@Slf4j
@Component //关键点:component注入
@Service
public class RabbitConsumer {

    private static OrderServiceImpl orderService; //关键点:注册为静态方法

    @Autowired  //关键点:利用autowired将service注入
    public void setOrderService (OrderServiceImpl orderService){
        RabbitConsumer.orderService = orderService;
    }

 

3. 为什么Controller层注入的是Service接口,而不是ServiceImpl实现类

错误代码:

Service层
    接口
    interface PCI{}
接口实现类
    @Service
    class PCIImpt imeplements PCI{}
 
Controller层
    @Autowired
    private PCIImpt pciImpt;    //注入了实现类

在没有使用maven管理的时候注入实现类编译一直未报错,也就是说编译可以通过,但是使用maven管理后,编译报错。 而正确的写法:

Controller层
    @Autowired
    private PCI pci;    //注入接口以Autowired自动接收

结果:编译通过;

 

结论就是:注入的是实现类对象,接收的接口;理解为多态;(Controller–Service–ServiceImpt–Mapper)

要遵循Controller–Service接口–ServiceImpt实现类–Mapper接口模式

那么在Service接口有多个ServiceImpt实现类的情况,就需要指定参数名来选择哪个ServiceImpt实现类了。

Service层(此时有两个接口实现类)
    @Service("PCIImpt1")
    class PCIImpt1 imeplements PCI{}
​
@Service("PCIimpt2")
class PCIImpt2 imeplements PCI{}
​
Controller层
    @Resource(name="PCIimpt2")  //填PCIimpt1,注入PCIimpt1实现类,填PCIimpt2,则注入PCIimpt2实现类
    private PCI pci;    //注入接口以Resource手动指定接收

同理:在ServiceImpt实现类中也是通过Mapper接口来接收;即:

ServiceImpt实现类
    @Autowired
    private Mapper mapper;

 

以上就是开发中遇到一些困惑和问题,举例不多但个人水平有限解决时间较长后总结的问题,希望后续大家多多分享交流。

文章来自个人专栏
大数据基础技术组件
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0