我遇到了Spring MVC的问题。我正在使用Stanford NLP,我把它初始化为singleton类。
@Component
@Scope("singleton")
public class JavaNLP implements NlpInterface
{
private DependencyNLP nlp_object = null;
@PostConstruct
public void init()
{
if (nlp_object == null) {
nlp_object = new DependencyNLP();
nlp_object.init("tokenize, ssplit, pos, lemma, ner, parse, dcoref");
}
}
@Override
public void init(String name, DataContainer container)
{
this.container = container;
nlp_object.annotate(container.getText());
}
@Override
public void execute()
{
...
}
}
每个请求都在调用init(String name, DataContainer container)
和execute
。问题出在 70%请求 nlp_object未初始化。
控制器内部:
@Autowired
@Qualifier("javaNLP")
private NlpInterface nlpInterface;
@RequestMapping(value = "/parse", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, headers = {"Content-type=application/json"})
public @ResponseBody
String parseWithGazetteerinJSON(@RequestBody DataContainer container)
{
String name = "Parsing text";
nlpInterface.init(name, container);
nlpInterface.execute();
JSONArray triples = nlpInterface.getTriplesAsJSON();
return triples.toString();
}
编辑1
不幸的是,它仍然无法正常工作。我想我发现了问题所在,只是不知道如何修复它。
我将配置+调用init函数放入config
<mvc:annotation-driven />
<context:component-scan base-package="com.metadata.tripletws.model" />
<context:component-scan base-package="com.metadata.tripletws.controller" />
<bean id="nlp" class="com.metadata.tripletws.service.Nlp" init-method="init"></bean>
我创建了一个名为Nlp的新对象,它只是DependencyNLP(外部库)的一个包络
@Component
public class Nlp
{
private DependencyNLP nlp;
public void init()
{
nlp = new DependencyNLP();
nlp.init();
}
public DependencyNLP getInstance()
{
return nlp;
}
public void execute()
{
...
}
...
}
然后我将此代码添加到控制器:
DependencyNLP nlpInstance = nlp.getInstance();
System.out.println(nlpInstance);
nlpInstance.annotate(container.getSection().getText());
nlpInstance.execute(...);
并定义了私有自动变量
@Autowired
private Nlp nlp;
印刷 nlpInstance 始终相同。这最终有意义。但这是我强烈要求的问题。请求相互影响。
有人知道怎么让它运行吗?
由于
答案 0 :(得分:0)
不要在nlp_object
方法中初始化@PostConstruct
,而是将其作为资源注入NlpInterface
的实现
不确定这是否能解决您的问题,但如果是我,我会试一试。
此外,您init()
方法(如果必须采用这种方法)应与同步块外部和内部的双if ( singletonObj == null)
门同步。