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