我正在编写一个小型Spring应用程序,该应用程序由一个名为service
的facade对象表示的模型和一个基于JSP的视图组成。在两者之间,我有常用的Spring控制器和一个转换器,它将字符串id转换为模型中的对象。
此转换器使用服务对象@Autowired
从service
中找到正确的模型对象。问题是,每当转换器访问service
中的方法时,都不会发生任何事情。没有错误或异常,它只是继续并返回null。
我已经检查了service
是否正确初始化,这似乎不是问题所在。在调试过程中,我注意到每当我试图在service
上执行一个方法时,程序都会通过ThreadPoolExecutor
并在那里停止。这使我认为问题与在service
被锁定时访问它有关。
我已经尝试将必要的代码放在同步块中,但这没有帮助。有人能告诉我为什么我不能访问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页面接收到的long类型的id从service
获取Publisher
对象。此方法转到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);
}
经过一个小时的摸索,我终于找到并解决了自己的问题。这个问题与多线程无关,而是与从String到long的转换有关。与其使用Long.getLong(id)
,我应该使用这样的东西:
@Override
public Publisher convert(String idString) {
return service.getPublisher(Long.parseLong(idString));
}
尝试将@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
}
您需要将IdToPublisherConverter定义为bean。像这个
@Service
public class IdToPublisherConverter...
只有初始化的bean才能使用@Autowired注释,否则将为null。如果IdToPublisherConverter不是bean,请使用ClasspathXmlApplicationcontext来获取spring-beans。
检查您的服务是否有@service注释,例如
@Service("mainService")
public class MainService...
在它内部,如果你有事务性方法,不要忘记@transactional
由于显示的代码很少,所以它很复杂,但我认为如果是这样的话,它会对您有所帮助。