2015-04-16 9 views
7

Najpierw w ogóle czytałem poprzednie pytanie: Exposing link on collection entity in spring data RESTnarażając linki Hypermedia dotyczące gromadzenia nawet ona pusta wykorzystujące Wiosna danych Rest

Ale problem nadal utrzymują się bez podstęp.

Rzeczywiście, jeśli chcę narażać łącza do zbiorów zasobów używam następujący kod:

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

To działa poprawnie z wyjątkiem gdy zbiór jest pusty ...

Jedynym sposobem na zastąpienie mojego kodu jest:

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

Ale dzięki temu link będzie dostępny dla wszystkich kolekcji s.

Potrafię stworzyć warunki do ujawnienia tylko tego, czego chcę, ale nie sądzę, że jest czysty.

Odpowiedz

2

Sądzę, że na wiosnę jest jakaś magia, która próbuje odkryć rodzaj kolekcji - na pustej kolekcji nie można stwierdzić, z jakiego źródła pochodzi - więc dane źródłowe nie mogą określić, który ResourceProcessor ma użyć.

Chyba widzieliśmy w org.springframework.data.rest.webmvc.ResourceProcessorHandlerMethodReturnValueHandler.ResourcesProcessorWrapper#isValueTypeMatch że starają się określić typ patrząc na pierwszy element w kolekcji i inaczej po prostu przestać przetwarzania:

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

Więc myślę, że nie można rozwiązać za pomocą sprężyny -data-rest. Dla kontrolera możesz wrócić do pisania niestandardowego kontrolera i używać wiosennych hateo i implementować własny ResourceAssemblerSupport, aby zobaczyć link również w pustych kolekcjach.