在自定义控制器中接受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
的一些私有方法中实现的(请参阅executeQueryMethod
和prepareUris
),因此没有简单的方法可以在自定义控制器中获取它。
您可以尝试使用Spring HATEOAS创建自己的参数解析器。 了解如何实现PersistentEntityResourceHandlerMethodArgumentResolver
解析器。 它基于@BackendId
解析了一个实体。
事实certificate,我在添加转换器的正确轨道上,不幸的是我用错误的配置方法。
通过将testConverter()
bean移动到RepositoryRestMvcConfiguration
扩展配置类然后添加,我能够获得所需的function
@Override public void configureConversionService(ConfigurableConversionService service) { service.addConverter(testConverter()); }
并按预期工作。 我现在感觉有点傻,因为首先把它丢在错误的位置,但希望这会帮助别人出去!