SpringBoot没有拿起自定义转换器

时间:2019-07-23 07:45:24

标签: spring-boot spring-data-rest

我正在基于Spring Boot 2.1.6运行Spring Data Rest应用程序,并希望注册一个自定义转换器以将字符串转换为对象:

curl http://localhost:8082/dataPoints/search/findByTrackable\?trackable\=http://localhost:8081/trackables/23

@RepositoryRestResource(exported = true)
public interface DataPointRepo extends CrudRepository<DataPoint<?>, Long> {
    public Set<DataPoint<?>> findByTrackable(Trackable trackable);  
}

Trackable实际上不是此应用程序中的持久实体,而是远程资源,如curl命令中使用的两个不同端口号所见。

我要在本地存储的只是可跟踪资源的ID,但我希望findByTrackable使用URL而不是ID值。

我创建此转换器只是为了看到它被调用:

@Component
public class UrlToTrackableConverter implements Converter<String, Trackable> {

    @Override
    public Trackable convert(String source) {
        System.out.println("############################");
        System.out.println("Hell Yeah");
        return null;
    }

}

据我了解,用@Component注释类并实现Converter接口应该注册该转换器,但是当我如上所述运行Curl时,我得到了它:

https://pastebin.com/Lsctw6uf

2 个答案:

答案 0 :(得分:0)

您还需要通过将UrlToTrackableConverter添加到FormatterRegistry来告诉Spring有关此新转换器的信息。

这可以通过实现WebMvcConfigurer并重写addFormatters()方法来实现:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new UrlToTrackableConverter());
    }
}

答案 1 :(得分:0)

因此,这是一个已弃用的解决方案:

@Configuration
public class RestConfig extends RepositoryRestConfigurerAdapter {

    @Override
    public void configureConversionService(ConfigurableConversionService conversionService) {
        conversionService.addConverter(new UrlToTrackableConverter());
        super.configureConversionService(conversionService);
    }

}

由于不建议使用RepositoryRestConfigurerAdapter,所以这不是理想的解决方案,而是可行的解决方案。如果有人知道如何正确执行此操作,请告诉我。