无法访问Spring转换器

时间:2016-04-12 15:35:24

标签: java spring multithreading converter

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

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

3 个答案:

答案 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

由于代码很少显示它很复杂,但我认为如果情况确实对你有帮助。