He creado la siguiente Projection
@Projection(name = "select", types = {Organisation.class}) public interface OrganisationSelectProjection { Long getId(); String getName(); } Que quiero usar básicamente en un componente "Seleccionar", así que necesito la menor cantidad de datos posible. Así que también quería eliminar todos los enlaces con un ResourceProcessor , así que creé esto:
@Bean public ResourceProcessor<Resource<OrganisationSelectProjection>> organisationProcessor() { return resource -> { resource.removeLinks(); return resource; }; } Sin embargo, parece que esto rompe toda la API, ya que cualquiera que sea el punto final que toque, recibo el siguiente mensaje de excepción org.springframework.hateoas.PagedResources cannot be cast to org.springframework.hateoas.Resource
¿Alguna idea de lo que he hecho mal?
Si desea mantener la clase anónima en su lugar, el uso de ResourceSupport en lugar de Resource puede resolver el problema.
@Bean public ResourceProcessor<ResourceSupport> organisationProcessor() { return resource -> { resource.removeLinks(); return resource; }; }Pero en este caso, el procesador se usará en todos y cada uno de los recursos, independientemente del tipo de contenido (aunque puede verificarlo dentro del cuerpo del método).
En lugar de un descendiente anónimo de ResourceProcessor , puede definirlo como una clase independiente:
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(); } El problema que experimentó tiene algo que ver con el borrado de tipos, ya que no hay ningún parámetro de tipo en la implementación de la clase anónima. Su definición es de tipo seguro, pero carece de los datos relacionados con el tipo que se utilizan en el tiempo de ejecución para determinar si un ResourceProcessor en particular puede procesar un recurso. Entonces spring-data-rest piensa que el procesador de organizationProcessor anónimo puede procesar PagedResources y lo alimenta al procesador donde ocurre ClassCastException .
No todo lo que spring-data-rest pasa por ResourceProcessor s es un Resource . Puede haber diferentes descendientes de la clase org.springframework.hateoas.ResourceSupport (como PagedResources en su caso) y la mayoría de ellos no se heredan de Resource .