Accepter un URI REST Spring Data dans un contrôleur personnalisé

J’ai une application webmvc Spring Data Rest que je voudrais append des fonctionnalités personnalisées pour les opérations par lots.

J’ai créé un contrôleur et l’ai intégré à l’espace de noms uri, mais j’aimerais qu’il puisse accepter les URI comme le font /search requêtes personnalisées /search , plutôt qu’un simple ID.

J’ai essayé d’enregistrer un convertisseur personnalisé (mon entité a un type ID Long , mais cela semble être ignoré. Existe-t-il un moyen de configurer mon contrôleur de sorte qu’il adopte ce comportement à partir des contrôleurs SDR implémentés automatiquement?

Même s’il existe une sorte de méthode que je peux appeler pour résoudre automatiquement un URI en entité, cela fonctionnerait tout aussi bien (je peux alors simplement accepter une Ssortingng dans mon contrôleur).

Voici où je suis.

 @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(Ssortingng.class, Long.class, testConverter()); } @Bean Converter testConverter() { return new Converter() { @Override public Long convert(Ssortingng source) { //this code does _not_ get run at any point if (source.indexOf('/') == -1) { return Long.parseLong(source); } source = source.subssortingng(source.lastIndexOf('/') + 1); Long id = Long.parseLong(source); return id; } }; } } 

SDR Config

 @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; } } 

Et mon contrôleur (artificiel):

ApplicationType est l’une de mes entités correctement gérées par la magie du SDR / référentiel

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

J’ai jeté un coup d’œil autour de moi, mais je n’arrive pas à tout réussir. Lorsque je crée un convertisseur qui utilise le référentiel, il n’est pas appelé non plus, car DomainClassConverter appelle simplement son convertisseur sous-jacent (qui échoue évidemment, car il ne peut pas parsingr correctement les types/1 dans un long.

Appréciez l’aide!

Oublié de mentionner

  • Spring Data Rest 2.4.0
  • Printemps HATEOAS 0.19.0
  • Printemps 4.2.1

Utilisation des référentiels JPA

Je publie une réponse basée sur mon dernier commentaire.

Apparemment, la logique dont vous avez besoin – @RequestParam de l’URI de @RequestParam en une entité gérée par un référentiel – est implémentée dans quelques méthodes privées de RepositorySearchController (voir executeQueryMethod et prepareUris ). Il n’existe donc pas de moyen facile de l’obtenir dans des contrôleurs personnalisés.

Vous pouvez essayer de créer votre propre résolveur d’argument avec Spring HATEOAS. Examinez comment le résolveur PersistentEntityResourceHandlerMethodArgumentResolver est implémenté. Il a résolu une entité basée sur son @BackendId .

En fin de compte, j’étais sur la bonne voie en ajoutant un convertisseur. Malheureusement, je le faisais avec la mauvaise méthode de configuration.

J’ai pu obtenir la fonctionnalité souhaitée en déplaçant mon testConverter() vers la classe de configuration d’extension RepositoryRestMvcConfiguration , puis en ajoutant

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

Et travailler comme prévu. Je me sens un peu bête maintenant de jeter ça au mauvais endroit, mais j’espère que cela aidera quelqu’un d’autre!