2015-04-16 8 views
7

Prima a tutti ho letto la domanda precedente: Exposing link on collection entity in spring data RESTEsporre i collegamenti ipermediali su collezione ancora è vuoto utilizzando primavera dati Resto

Ma il problema ancora persiste, senza trucco.

Infatti se voglio esporre un link per una collezione di risorse Sto utilizzando il seguente codice:

@Component 
public class FooProcessor implements ResourceProcessor<PagedResources<Resource<Foo>>> { 

    private final FooLinks fooLinks; 

    @Inject 
    public FooProcessor(FooLinks fooLinks) { 
     this.FooLinks = fooLinks; 
    } 

    @Override 
    public PagedResources<Resource<Foo>> process(PagedResources<Resource<Foo>> resource) { 
     resource.add(fooLinks.getMyCustomLink()); 
     return resource; 
    } 
} 

che funziona correttamente se non quando la raccolta è vuoto ...

L'unica modo per funzionare è quello di sostituire il mio codice seguente da:

@Component 
public class FooProcessor implements ResourceProcessor<PagedResources> { 

    private final FooLinks fooLinks; 

    @Inject 
    public FooProcessor(FooLinks fooLinks) { 
     this.FooLinks = fooLinks; 
    } 

    @Override 
    public PagedResources process(PagedResources resource) { 
     resource.add(fooLinks.getMyCustomLink()); 
     return resource; 
    } 
} 

Ma facendo ciò il collegamento verrà esposto per tutta la raccolta S.

Posso creare condizioni per esporre solo per quello che voglio ma non penso sia pulito.

risposta

2

penso che la primavera fa qualche magia lì cercando di scoprire il tipo di raccolta - su un insieme vuoto non si può dire quale tipo è di - così primavera-dati-resto non si può stabilire quale ResourceProcessor da utilizzare.

Penso che ho visto in org.springframework.data.rest.webmvc.ResourceProcessorHandlerMethodReturnValueHandler.ResourcesProcessorWrapper#isValueTypeMatch che cercano di determinare il tipo, cercando in primo elemento della collezione e comunque solo smettere di lavorazione:

if (content.isEmpty()) { 
    return false; 
} 

Quindi penso non è possibile risolvere questo usando primavera -data-riposo. Per il tuo controller potresti ricorrere alla scrittura di un controller personalizzato e usare gli hateo primaverili e implementare il tuo ResourceAssemblerSupport per vedere il link anche sulle collezioni vuote.