2016-10-12 1 views
3

ich die RepositoryEntityLinks Klasse verwenden möchten, um den Link zu einer Ressource an verschiedenen Orten in meinem Code zu erhalten gemäss Abschnitt 12.1 des aktuellen Spring Data Rast HandbuchMit Spring Data Erholung RepositoryEntityLinks außerhalb des Controllers

12.1. Programmatic Links Sometimes you need to add links to exported resources in your own custom built Spring MVC controllers. There are three basic levels of linking available:

...

3 Using Spring Data REST’s implementation of RepositoryEntityLinks.

http://docs.spring.io/spring-data/rest/docs/current/reference/html/#_programmatic_links

Ich beachte, dass die Dokumentation explizit auf "... Ihre eigenen benutzerdefinierten Spring MVC Controller" verweist und es scheint, dass dies der einzige Ort ist, an dem es verfügbar ist. Ich mag die konfigurierte Instanz in einem Spring Security AuthenticationSuccessHandler verwende jedoch die Anwendung mit dem Fehler nicht anspringt:

Keine Warte Bohnen vom Typ [org.springframework.data.rest.webmvc.support.RepositoryEntityLinks] gefunden

Ich konnte es erfolgreich in einen Controller injizieren wie erwartet.

Kann ich die RepositoryEntityLinks-Klasse außerhalb eines Spring MVC Controllers verwenden?

public class RestAuthenticationSuccessHandler implements AuthenticationSuccessHandler 
{ 
    @Autowired 
    private RepositoryEntityLinks entityLinks; 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, 
     Authentication authentication) throws IOException, ServletException 
    { 
    //do something with entityLinks 
    } 
} 

Antwort

0

Ja, Sie können. Ich habe es erfolgreich in Assembler verwendet, der Links von HATEOAS-Modell generiert. Obwohl es einige Einschränkungen geben kann, wo RepositoryEntityLinks Klasse injiziert werden kann, kann es sicher außerhalb von Controllern verwendet werden.

Unten können Sie mein Arbeitsbeispiel sehen. Wenn jemand diese Klasse erweitert, erweitert sich ResourceAssemblerSupport, die Teil des spring-hateoas Moduls ist. Vielleicht ist es das, was hier die Injektion ermöglicht.

@Component 
public class UserAssembler extends ResourceAssemblerSupport<UserEntity, UserResource> { 

    @Autowired 
    private RepositoryEntityLinks repositoryEntityLinks; 

    public UserAssembler() { 
     super(UserController.class, UserResource.class); 
    } 

    @Override 
    public UserResource toResource(UserEntity userEntity) { 
     Link userLink = repositoryEntityLinks.linkToSingleResource(UserEntity.class, userEntity.getId()); 
     Link self = new Link(entryLink.getHref(), Link.REL_SELF); 
     return new UserResource(userEntity, self); 
    } 
} 
Verwandte Themen