2017-03-29 1 views
2

J'ai créé les éléments suivants ProjectionReste données Spring ResourceProcessor pour Exception de projection

@Projection(name = "select", types = {Organisation.class}) 
public interface OrganisationSelectProjection { 

    Long getId(); 

    String getName(); 

} 

Ce que je veux utiliser essentiellement dans un composant « Select » donc j'ai besoin le moins de données possible. Donc, je voulais aussi supprimer tous les liens avec un ResourceProcessor, donc j'ai créé ceci:

@Bean 
public ResourceProcessor<Resource<OrganisationSelectProjection>> organisationProcessor() { 
    return resource -> { 
     resource.removeLinks(); 
     return resource; 
    }; 
} 

Cependant, il semble que cela brise l'API entière puisque tout point final je frappe, je reçois le message d'exception suivante org.springframework.hateoas.PagedResources cannot be cast to org.springframework.hateoas.Resource

Une idée de ce que j'ai mal?

+0

Quelle version de * spring-hateoas * utilisez-vous? Spring-boot 1.5.2 (actuel) a spring-hateoas-0.23 où il doit bien fonctionner ... – Cepr0

+0

J'utilise 0.20.0 avec Spring-Boot 1.4.3, mais je vais mettre à jour vers 1.5.2 et l'essayer out – ChrisGeo

+0

Testé avec 1.5.2 et ne fonctionne toujours pas – ChrisGeo

Répondre

2

Si vous souhaitez conserver la classe anonyme en place, utilisez ResourceSupport au lieu de Resource pour résoudre le problème.

@Bean 
public ResourceProcessor<ResourceSupport> organisationProcessor() { 
    return resource -> { 
     resource.removeLinks(); 
     return resource; 
    }; 
} 

Mais dans ce cas, le processeur sera utilisé sur chaque ressource, indépendamment du type de contenu (vous pouvez vérifier que l'intérieur du corps de la méthode bien).

Au lieu de descendant anonyme de ResourceProcessor vous pouvez le définir en tant que classe autonome:

public class OrganizationResourceProcessor implements ResourceProcessor<Resource<OrganisationSelectProjection>> { 
    @Override 
    public Resource<OrganisationSelectProjection> process(Resource<OrganisationSelectProjection> resource) { 
     resource.removeLinks(); 
     return resource; 
    } 
} 

@Bean 
public OrganizationResourceProcessor organisationProcessor() { 
    return new OrganizationResourceProcessor(); 
} 

La question que vous expereinced a quelque chose à voir avec l'effacement de type car il n'y a pas de paramètres de type dans la classe anonyme la mise en oeuvre. Votre définition est de type sécurité, mais il manque les données liées au type qui sont utilisées au moment de l'exécution pour déterminer si un ResourceProcessor particulier peut traiter une ressource. Donc spring-data-rest pense que organizationProcessor anonyme peut traiter PagedResources et le nourrit au processeur où ClassCastException se produit.

Pas tout spring-data-rest passe s est un Resource. Il peut y avoir différents descendants de classe org.springframework.hateoas.ResourceSupport (comme PagedResources dans votre cas) et la majorité d'entre eux ne sont pas hérités de Resource.

+0

Malheureusement, une limitation de la façon dont lambdas sont mis en œuvre. J'ai soulevé ce problème sur la liste de diffusion mais je n'ai pas reçu trop de réponse: http://mail.openjdk.java.net/pipermail/compiler-dev/2017-January/010675.html –