我正在编写一个小型Spring应用程序,它由一个名为service
的外观对象表示的模型和一个基于JSP的视图组成。在我之间我有通常的Spring控制器和一个转换器,它将字符串id转换为模型中的对象。
此转换器使用服务对象@Autowired
从service
中查找正确的模型对象。问题是每当转换器访问service
中的方法时,都不会发生任何事情。没有错误或异常,它只是继续并返回null。
我已经检查过service
是否已正确初始化,这似乎不是问题所在。调试时我注意到程序经过ThreadPoolExecutor
并在我尝试在service
上执行方法时停止。这使我认为问题与锁定时访问service
有关。
我已经尝试将必要的代码放在synchronized块中,但这没有帮助。任何人都可以告诉我为什么我不能从Spring转换器中的@Autowired
对象访问任何方法吗?
以下是转换器类的价值:
public class IdToPublisherConverter implements Converter<String, Publisher>{
@Autowired
private MainService service;
@Override
public Publisher convert(String id) {
return service.getPublisher(Long.getLong(id));
}
}
编辑:
MainService
是一个facade对象,它提供了一个接口来获取,添加,更新和删除我的模型数据(Game
对象和Publisher
对象)
service.getPublisher(id)
根据转换器从JSP页面收到的类型为id,从Publisher
获取service
个对象。此方法在MainService
:
@Override
public Publisher getPublisher(long id) {
Publisher publisher = repository.readPublisher(id);
return publisher;
}
其中:
private final Map<Long, Publisher> publishers;
...
@Override
public Publisher readPublisher(long id) {
return publishers.get(id);
}
答案 0 :(得分:0)
经过一个小时的摆弄,我终于找到并解决了我自己的问题。
该问题与多线程无关,而是与String到long的转换有关。我应该使用类似这样的东西,而不是使用Long.getLong(id)
:
@Override
public Publisher convert(String idString) {
return service.getPublisher(Long.parseLong(idString));
}
答案 1 :(得分:0)
尝试将@Component注释添加到转换器中。确保您的转换器在SpringConfiguration中注册
@Configuration
@EnableWebMvc
@ComponentScan
public class ServerConfig extends WebMvcAutoConfigurationAdapter {
@Override
public void addFormatters(FormatterRegistry formatterRegistry) {
converterAutoscanner(formatterRegistry);
super.addFormatters(formatterRegistry);
}
@SuppressWarnings("rawtypes")
private void converterAutoscanner(FormatterRegistry formatterRegistry) {
Reflections reflections = new Reflections("com.somepackege");
Set<Class<? extends Converter>> allClasses = reflections.getSubTypesOf(Converter.class);
allClasses.forEach(s -> {
try {
formatterRegistry.addConverter(s.newInstance());
} catch (Exception e) {
LOGGER.error(e);
}
});
}
}
@Component
public class CommentConverter implements Converter<String, Comment>{
//converter code
}
答案 2 :(得分:-1)
检查您的服务是否有@Service注释,例如
@Service("mainService")
public class MainService...
并且在其内部,如果您有交易方法,请不要忘记@Transactional
由于代码很少显示它很复杂,但我认为如果情况确实对你有帮助。