我们将一个spring bean实现为单例(默认)。此bean用作Web服务的一部分,当触发多个同时请求时,responseholder(单例bean)在尝试检索时抛出NullPointerException。这通常发生在响应是build的时候,然后在发送回原始响应之前触发了一个新的请求。
这可能是bean的单点实现造成的吗?如果是的话,就不会改成原型来解决我的问题了。总是用新操作员启动它怎么样?这样做是否会对性能产生影响?还是有更好的办法。
如有任何帮助,将不胜感激。
编辑:
代码详细信息
public class BuildToolRequestProcessor {
private BuildToolResponse buildToolResponse;
.....
//And it has been referenced in the code in different methods, setting the response details..
public String process(BuildToolRequestXml buildToolRequestXml) throws Exception {
buildToolResponse.setLocation(location);
...
public String handleDetails(BuildToolRequestXml buildToolRequestXml) throws Exception {
buildToolResponse.setSchedule(schedule);
...
// And in another method, when I try to retrieve the Location, it throws a Null Pointer Exception..
buildToolResponse.getLocation().getPinCode()
//Bean configuration
<bean id="buildToolResponse"
class="com.raj.buildTool.processor.BuildToolResponse"/>
附加说明:我尝试在第一个请求的响应之前引入一个延迟,然后拍摄另一个请求。第二个请求将该位置重置为空,因此在尝试检索该位置时抛出NPE。会不会是因为那个单身?此外,我还没有使用new操作符重新初始化buildToolResponse,但是类buildToolResponse从BuildToolResponseBuilder扩展而来,我正在使用“new”初始化BuildToolResponseBuilder来构建响应。
这可能是bean的单点实现造成的吗?如果是的话,就不会改成原型来解决我的问题了。
如果您有一个单例bean,请确保此bean不维护任何状态。这意味着,它不应该有任何基于某些方法重新初始化的字段,除了由spring完成的另一个bean或资源的注入。这可能会导致并发问题,特别是在多个线程中使用bean时(在本例中,处理对web服务的多个请求)。
这是一个将在多线程上使用的spring bean的错误设计示例:
@Component
public class SingletonByDefaultBean {
private StringBuilder responseBuilder;
@Autowired
private FooService fooService;
public String methodUsedInSeveralThreads() {
//here you will have a concurrency issue
responseBuilder = new StringBuilder();
//write contents into the response
//...
//return the response
return responseBuilder.toString();
}
}
要解决这个问题,您有两种方法:
>
删除bean的任何状态,并将属性移动到方法局部变量中:
@Component
public class SingletonByDefaultBean {
//private StringBuilder responseBuilder;
@Autowired
private FooService fooService;
public String methodUsedInSeveralThreads() {
StringBuilder responseBuilder = new StringBuilder();
//write contents into the response
//...
//return the response
return responseBuilder.toString();
}
}
将bean的作用域更改为prototype
@Component
@Scope("prototype")
public class SingletonByDefaultBean {
private StringBuilder responseBuilder;
@Autowired
private FooService fooService;
public String methodUsedInSeveralThreads() {
responseBuilder = new StringBuilder();
//write contents into the response
//...
//return the response
return responseBuilder.toString();
}
}
总是用新操作员启动它怎么样?
参考这个答案,了解如何手动创建实例您的类,并使其由spring管理。这不是那么容易的,我建议只有当你真正了解你在做什么的时候才使用这些方法。
当我得到一个Spring豆(通过getBean())时,有没有办法从java代码中验证豆子是否已经用范围=原型定义了? Spring配置: Java: sc 我可以实例化它两次并比较对象,但是我想避免不必要的对象创建。这个答案的反义词可能会有用:https://stackoverflow.com/a/9125610/156477
我想制作一个AngularJS Spring MVC Hibernate MySQL应用程序。我不知道如何配置SpringBean,这样我就可以对我的存储库和实体类使用自动连接的注释。 pom.xml依赖: 实体类: 的存储库: 的控制器: 配置类:
本文向大家介绍jstree的简单实例,包括了jstree的简单实例的使用技巧和注意事项,需要的朋友参考一下 最近使用到了jstree,感觉是一款灵活的、可多项定制的tree插件; 我这边使用过程记录下; 参考的jstree api网站,以及demo介绍: https://www.jstree.com/api/#/ jstree api github: https://github.com/vaka
本文向大家介绍python实现简单的socket server实例,包括了python实现简单的socket server实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python实现简单的socket server的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的Python程序设计有所帮助。
本文向大家介绍javascript实现继承的简单实例,包括了javascript实现继承的简单实例的使用技巧和注意事项,需要的朋友参考一下 作为一门面向对象的语言,那么继承自然就是一大特征,下面是一段非常简单代码实例,它演示了实现继承的基本原理,有兴趣的或者恰好要学习此方面的朋友可以参阅一下,希望能够给大家来帮组。 以上所述就是本文的全部内容了,希望大家能够喜欢。
本文向大家介绍javascript实现的闭包简单实例,包括了javascript实现的闭包简单实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript实现的闭包。分享给大家供大家参考。具体如下: 希望本文所述对大家的javascript程序设计有所帮助。