我正在基于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时,我得到了它:
答案 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,所以这不是理想的解决方案,而是可行的解决方案。如果有人知道如何正确执行此操作,请告诉我。