【问题标题】:SpringBoot Not Picking Up Custom ConverterSpring Boot 不支持自定义转换器
【发布时间】:2019-07-23 07:45:24
【问题描述】:

我正在运行基于 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

【问题讨论】:

    标签: spring-boot spring-data-rest


    【解决方案1】:

    您还需要通过将UrlToTrackableConverter 添加到FormatterRegistry 来告诉Spring 这个新转换器。

    这可以通过实现WebMvcConfigurer 并覆盖addFormatters() 方法来完成:

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Override
        public void addFormatters(FormatterRegistry registry) {
            registry.addConverter(new UrlToTrackableConverter());
        }
    }
    

    【讨论】:

    • 我添加了您建议的 WebConfig,但仍然收到相同的错误消息。
    • findByTrackable返回Trackable
    • 但这在 DataPointRepo 中。在这里返回 Trackable 似乎没有多大意义,是吗?我想找到所有引用该 Trackable 的数据点。
    • 问:你说你用的是spring boot,是不是@EnableAutoConfiguration开启了?
    • 另外,您的存储库配置是什么?您在使用@RepositoryRestController 作为您的控制器方法吗?
    【解决方案2】:

    所以,这是一个已弃用的解决方案:

    @Configuration
    public class RestConfig extends RepositoryRestConfigurerAdapter {
    
        @Override
        public void configureConversionService(ConfigurableConversionService conversionService) {
            conversionService.addConverter(new UrlToTrackableConverter());
            super.configureConversionService(conversionService);
        }
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2015-08-25
      • 1970-01-01
      • 2016-03-18
      • 2016-07-30
      相关资源
      最近更新 更多