2016-04-25 3 views
1

Ich habe ein Spring-Boot-Projekt, das eine @RestController und ein Vaadin @SpringUI bietet.Entfernen (vaadin) Servlet-Anweisung im Frühjahr hateos link

die Vaadin ui Zugriff ist möglich durch url: http://localhost:8080/

Durch ui Benutzer-Geräte erstellen. Diese Geräteerstellung erfolgt durch Aufruf meines @RestControllers in meiner Vaadin-Klasse. Der letzte Teil ist die Erstellung des Geräts. Und jetzt beginnt das Problem. Geräteobjekte haben ein hateos Link-Member, das im Konstruktor initialisiert wurde. Die Linkerstellung erfolgt mit Spring ControllerLinkBuilder.

Problem ist, dass die hateos link nicht ordnungsgemäß erstellt wird. Der Link sieht wie folgt aus:

"href": "http://localhost:8080/vaadinServlet/devices/1" 

Aber die Verbindung ist wie folgt aussehen (ohne vaadinServlet):

"href": "http://localhost:8080/devices/1" 

RestController für die Schaffung neuer Geräte:

@RestController 
@RequestMapping("/devices") 
public class DevicesRestController { 

    @RequestMapping(value="/{deviceID}", method=RequestMethod.GET) 
    @ResponseBody 
    public HttpEntity<Device> getDevice(@PathVariable("deviceID") int deviceID) { 
     // return device 
    } 

    @RequestMapping(method=RequestMethod.POST) 
    @ResponseBody 
    public ResponseEntity<Device> postDevice() { 
     // return new device 
    } 
} 

Vaadin UI Erstellung der Gerät:

public class VaadinController { 

    @Autowired 
    private DevicesRestController devicesRestController; 

    private Device createDevice() { 
     Device postDevice = devicesRestController.postDevice().getBody(); 
     return postDevice; 
    } 

} 

My Device-Klasse mit hateos Link-

public class Device { 
    private final Link self; 

    public Device() { 
     this.self = ControllerLinkBuilder.linkTo(DevicesRestController.class).withSelfRel(); 
    } 

} 

So lange Geschichte kurz: Wie kann ich von der/vaadinServlet in meinem hateos Link von Spring ControllerLinkBuilder erstellt loswerden?

Edit 1: Sie dieses Problem lösen können ganz einfach, wenn ich die @RestController in meinem VaadinController nicht autowire nur durch die RestTemplate Klasse aufrufen. Siehe den folgenden Code snipped:

public class VaadinController { 

    private Device createDevice() { 
     RestTemplate rt = new RestTemplate(); 
     ResponseEntity<Device> postForEntity = rt.postForEntity(new URI("http://localhost:8080/devices/"), <REQUEST_DAT>, Device.class); 
     return postForEntity.getBody(); 
    } 

} 

Aber ich denke, dass nicht best practice ist und eine ‚nicht so sauber‘ Art und Weise, das zu tun. Also meine Frage ist immer noch die gleiche: Wie die/vaadinServlet Informationen in meinem hateos-Link zu entfernen?

Antwort

0

Zunächst einmal, rufen Sie nicht Ihre @RestController Klassenmethoden von anderswo als Testen.

Vaadin und Spring Hateoas sind zwei verschiedene Technologien, mischen Sie sie nicht. In der Tat hat dein Problem nichts mit Vaadin zu tun. Hateoas-Links werden aus der aktuellen Anfrage erstellt. Wenn die aktuelle Anforderung von einem anderen Servlet bedient wird, enthält sie sicher die URL dieses Servlets. Sie haben hier zwei Möglichkeiten:

a) Verarbeiten Sie die empfangene Link-URL: Entfernen Sie vaadinServlet über die String-Verarbeitung. Dies mag chaotisch erscheinen, ist aber akzeptabel, da Ihre Absicht nicht die Art ist, für die hateoas entwickelt wurde.

b) Verwenden Sie Vaadin nicht für diese Aufgabe. Verwenden Sie JavaScript, um den entsprechenden Endpunkt aufzurufen und dem Benutzer anzuzeigen. Es wird korrekte Links haben.

c) Ändern ServletRequestAttributes Objekt direkt: RequestContextHolder.setRequestAttributes(requestAttributes) Sie müssen möglicherweise einige Java-Magie tun oder einen MockHttpServletRequest verwenden.

Meine empfohlene Lösung wäre b).

Übrigens ist Ihre "Edit 1" -Lösung keine echte Lösung, da sie die Anwendung an localhost: 8080 koppelt und die aktuellen Sitzungsvariablen einschließlich (falls vorhanden) des aktuellen Benutzers ignoriert.

Viel Glück.