在自定义控制器中接受Spring Data REST URI

我有一个Spring Data Rest webmvc应用程序,我想为批处理操作添加一些自定义function。

我已经创建了一个控制器,并将其混合到uri命名空间中,但我希望它能够像自定义/search查询一样接受URI,而不仅仅是ID。

我已经尝试注册一个自定义转换器(我的实体有一个Long ID类型,但似乎被忽略。有没有办法配置我的控制器,使其采用自动实现的SDR控制器的行为?

即使有某种方法我可以调用它会自动解析一个实体的URI,这也可以正常工作(因为我可以在我的控制器中接受一个String

这就是我在的地方。

 @Configuration public class CustomWebConfiguration extends WebMvcConfigurationSupport { //irrelevant code omitted @Bean public DomainClassConverter domainClassConverter() { DomainClassConverter dc = new DomainClassConverter(mvcConversionService()); return dc; } @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(String.class, Long.class, testConverter()); } @Bean Converter testConverter() { return new Converter() { @Override public Long convert(String source) { //this code does _not_ get run at any point if (source.indexOf('/') == -1) { return Long.parseLong(source); } source = source.substring(source.lastIndexOf('/') + 1); Long id = Long.parseLong(source); return id; } }; } } 

SDR配置

 @Configuration @EnableHypermediaSupport(type = { HypermediaType.HAL }) public class CustomRestConfiguration extends RepositoryRestMvcConfiguration { @Override public RepositoryRestConfiguration config() { RepositoryRestConfiguration config = super.config(); config.setBasePath("/api"); config.exposeIdsFor(ApplicationMembership.class); return config; } } 

而我的(人为的)控制器:

ApplicationType是我的一个实体,由SDR / repository magic正确管理

 @BasePathAwareController @RepositoryRestController @RequestMapping("applications/special") public class ApplicationExtensionController { @RequestMapping("a") public ResponseEntity reply(@RequestParam("type") ApplicationType type) { return new ResponseEntity(type.getIcon(), HttpStatus.OK); } } 

我看了很多,但不能完全做任何事情。 当我创建一个利用存储库的转换器时,它也不会被调用,因为DomainClassConverter只是调用它的底层转换器(显然失败了,因为它无法正确地将types/1解析为很久了

感谢帮助!

忘了提

  • Spring Data Rest 2.4.0
  • springHATEOAS 0.19.0
  • 春季4.2.1

使用JPA存储库

我根据我的上次评论发布了答案。

显然,您需要的逻辑 – 从@RequestParam自动转换URI到存储库管理的实体 – 是在RepositorySearchController的一些私有方法中实现的(请参阅executeQueryMethodprepareUris ),因此没有简单的方法可以在自定义控制器中获取它。

您可以尝试使用Spring HATEOAS创建自己的参数解析器。 了解如何实现PersistentEntityResourceHandlerMethodArgumentResolver解析器。 它基于@BackendId解析了一个实体。

事实certificate,我在添加转换器的正确轨道上,不幸的是我用错误的配置方法。

通过将testConverter() bean移动到RepositoryRestMvcConfiguration扩展配置类然后添加,我能够获得所需的function

 @Override public void configureConversionService(ConfigurableConversionService service) { service.addConverter(testConverter()); } 

并按预期工作。 我现在感觉有点傻,因为首先把它丢在错误的位置,但希望这会帮助别人出去!