无法访问 Spring 转换器中的自动连线对象



我正在编写一个小型Spring应用程序,该应用程序由一个名为service的facade对象表示的模型和一个基于JSP的视图组成。在两者之间,我有常用的Spring控制器和一个转换器,它将字符串id转换为模型中的对象。

此转换器使用服务对象@Autowiredservice中找到正确的模型对象。问题是,每当转换器访问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

由于显示的代码很少,所以它很复杂,但我认为如果是这样的话,它会对您有所帮助。

最新更新