2017-09-03 1 views
1

J'ai un problème suivant. J'ai fait une application qui utilise spring-data et l'expose comme un service REST en utilisant spring-data-rest. Tout s'est bien passé jusqu'à ce que je veuille avoir une implémentation personnalisée. J'ai créé un CustomSomethingRepository et SomethingRepositoryImpl avec une méthode supplémentaire. L'interface de Spring Data Repository a étendu CustomSomethingRepository et tout allait bien, j'ai pu exécuter ma méthode directement depuis le test, l'implémentation personnalisée a été exécutée aussi. Puis j'ai essayé de l'obtenir via l'API REST et là, j'ai été surpris que cette méthode ne soit pas disponible via/somethings/search. Je suis presque sûr à cent pour cent que cela a bien fonctionné au printemps boot 1.3.x et JpaRepositories. Maintenant, j'utilise boot 1.5.x et MongoRepository. S'il vous plaît jeter un oeil à mon code exemple:Comment exposer l'implémentation personnalisée du point de terminaison Spring Data Rest

@RepositoryRestResource 
public interface SomethingRepository extends CrudRepository<Something>, CustomSomethingRepository { 

    //this one is available in /search 
    @RestResource(exported = true) 
    List<Something> findByEmail(String email); 
} 

et une interface personnalisée

public interface CustomSomethingRepository { 
    //this one will not be available in /search which is my problem :(
    List<Something> findBySomethingWhichIsNotAnAttribute(); 
} 

et la mise en œuvre

@RepositoryRestResource 
public class SomethingRepositoryImpl implements CustomSomethingRepository { 

    @Override 
    public List<Something> findBySomethingWhichIsNotAnAttribute() { 
     return new ArrayList<>(); //dummy code 
    } 
} 

Pourriez-vous s'il vous plaît me donner une idée comment puis-je exposer CustomSomethingImpl comme partie du point de terminaison de repos sans créer un autre haricot de mvc de ressort régulier qui traitera juste cette demande simple? J'ai lu des questions comme ceci: Implementing custom methods of Spring Data repository and exposing them through REST qui disent que ce n'est pas possible, mais croyez-moi ou non, j'ai eu un projet avec spring-boot 1.3.x et ces implémentations ont été exposées aussi :).

Merci!

+0

Peut-être mon [Comment] (https://stackoverflow.com/q/45401734) sera utile .. – Cepr0

+0

Salut, merci pour votre réponse, mais il ne pas exposer la mise en œuvre personnalisée, vous créez un autre contrôleur seulement ce qui est une solution de contournement, je dirais. Le problème est comment exposer automatiquement l'implémentation personnalisée qui est disponible à partir du niveau de données de printemps. –

+0

Mon inattention ..)) – Cepr0

Répondre

0

Puisque votre méthode personnalisée renvoie une liste, vous devez la placer dans SomethingRepository, ce qui sera placé dans le chemin/search par le reste des données. Ajouter Liste findByNotAttribute()

@RepositoryRestResource public interface SomethingRepository extends CrudRepository<Something> { 
@RestResource(exported = true) 
List<Something> findByEmail(String email); 

List<Something> findByNotAttribute(@Param String attribute); 
} 
+0

Oui, mais il n'utilisera pas une implémentation personnalisée de SomethingRepositoryImpl, ce qui est mon objectif. –