java – 在自定义控制器中接受一个Spring数据REST URI

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

我创建了一个控制器,并将其混合到uri命名空间中,但我希望它可以像自定义/搜索查询那样接受URI,而不是简单的ID.

我尝试注册一个自定义的< String,Long>转换器(我的实体有一个长ID类型,但是似乎被忽略)有没有办法配置我的控制器,以便它采用自动实现的SDR控制器的行为?

即使有某种方法,我可以调用它将自动解析一个URI到一个实体,这也是一样的(因为我可以直接在控制器中接受一个String)

这是我在哪里

@Configuration
public class CustomWebConfiguration extends WebMvcConfigurationSupport {

    //irrelevant code omitted

    @Bean
    public DomainClassConverter<?> domainClassConverter() {
        DomainClassConverter<FormattingConversionService> dc = new DomainClassConverter<FormattingConversionService>(mvcConversionService());
        return dc;
    }

    @Override
    public void addFormatters(FormatterRegistry registry) {
          registry.addConverter(String.class, Long.class, testConverter());
    }

    @Bean 
    Converter<String, Long> testConverter() {
        return new Converter<String, Long>() {

            @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 /存储库魔法正确管理的我的实体之一

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

我已经看了很多,但不能做任何工作.当我创建一个< String,ApplicationType>转换器利用存储库,它也不会被调用,因为DomainClassConverter只是调用其底层的< String,Long>转换器(这显然失败了,因为它不能正确地解析出类型/ 1成长.

欣赏帮助!

忘了提了

> Spring Data Rest 2.4.0
> Spring HATEOAS 0.19.0
> Spring 4.2.1

使用JPA存储库

最佳答案
事实证明,我在添加一个转换器在正确的轨道,不幸的是我在错误的配置方法.

我可以通过将我的testConverter()bean移动到RepositoryRestMvcConfiguration扩展配置类,然后添加

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

并按预期工作.我觉得有点傻了,把它丢在第一位错误的地方,但希望这会帮助别人出去!

转载注明原文:java – 在自定义控制器中接受一个Spring数据REST URI - 代码日志