2017-10-05 2 views
1

Ich habe ein Projekt mit Spring Boot 1.5.7, Spring Data REST, Hibernate, Spring JPA, Swagger2.Anpassen von Endpunkten mit Spring Data REST

Ich habe zwei Bohnen wie diese:

@Entity 
public class TicketBundle extends AbstractEntity { 
    private static final long serialVersionUID = 404514926837058071L; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private List<Note> notes = new ArrayList<>(); 

    ..... 
    } 

und

@Entity 
public class Note extends AbstractEntity { 
    private static final long serialVersionUID = -5062313842902549565L; 

    @Lob 
    private String text; 
    ... 
    } 

ich meine Methoden über Repository aussetzt:

@Transactional 
@RepositoryRestResource(excerptProjection = TicketBundleProjection.class) 
@PreAuthorize("isAuthenticated()") 
public interface TicketBundleRepository extends PagingAndSortingRepository<TicketBundle, Long> { 
.... 
} 

so in Prahlerei sehe ich den Endpunkt an dem ich interessiert bin, dass die Sammlung von Notizen aus einem bestimmten Ticketpaket geladen werden muss:

enter image description here

Jetzt möchte ich die Standard-GET /api/v1/ticketBundles/{id}/notes und ersetzen, dass mit meiner benutzerdefinierten Methode zu überschreiben ich in TicketBundleRepository setzen:

@Transactional(readOnly = true) 
@RestResource(rel = "ticketBundleNotes", path = "/ticketBundles/{id}/notes") 
@RequestMapping(method = RequestMethod.GET, path = "/ticketBundles/{id}/notes") 
@Query("SELECT n FROM TicketBundle tb JOIN tb.notes n WHERE tb.id=:id ORDER BY n.createdDate DESC,n.id DESC") 
public Page<Note> getNotes(@Param("id") long id, Pageable pageable); 

Es ist sehr bequem, die Abfrage auf diese Weise erstellen, da muss ich Verwenden Sie Auslagerungsdatei und geben Sie eine Seite zurück. Leider habe ich an dieser Stelle zwei Probleme.

Erstes Problem Die Methode basiert auf der instad Endpunkt /api/v1/ticketBundles/search/ticketBundles/{id}/notes kartiert von /api/v1/ticketBundles/ticketBundles/{id}/notes enter image description here

Zweites Problem Wenn ich die Methode von Prahlerei nennen erhalte ich eine HTTP 404:

Der Antrag scheint falsch zu sein. Scheint die Pfadvariable nicht verstanden wird:

curl -X GET --header 'Accept: application/json' 'http://localhost:8080/api/v1/ticketBundles/search/ticketBundles/{id}/notes?id=1' 

Dies ist die Antwort von dem Server ist:

{ 
    "timestamp": "2017-10-05T14:00:35.563+0000", 
    "status": 404, 
    "error": "Not Found", 
    "message": "No message available", 
    "path": "/api/v1/ticketBundles/search/ticketBundles/%7Bid%7D/notes" 
} 

ohne Fehler auf der Serverseite.

Gibt es eine Möglichkeit, den Endpunkt GET/api/v1/ticketBundles/{id}/notes durch Repository ohne Verwendung eines benutzerdefinierten Controllers zu überschreiben (mit dem würde ich die Möglichkeiten zur Verwaltung der Auslagerungsdatei verlieren)?

Außerdem, was mache ich falsch, um ein HTTP 404 in dem oben gezeigten Anruf zu erhalten?

Antwort

0

Ich glaube, Sie verwenden falsche Anmerkungen. Sie müssten Ihre Klasse mit @RestController annotieren und @PathVariable für Ihre Methode anstelle von @Param verwenden. Hier ist ein funktionierendes Beispiel, das Sie vielleicht nach Ihren Bedürfnissen anpassen möchten.

@org.springframework.data.rest.webmvc.RepositoryRestController 
@org.springframework.web.bind.annotation.RestController 
public interface PersonRepository extends org.springframework.data.repository.PagingAndSortingRepository<Person, Long> { 

    @org.springframework.web.bind.annotation.GetMapping(path = "/people/{id}") 
    Person findById(@org.springframework.web.bind.annotation.PathVariable("id") Long id); 

} 
+0

Vielen Dank für Ihre Antwort. Leider ist es laut https://jira.spring.io/browse/DATAREST-1154 nicht möglich, @PathVariable in ein RestRepository zu verwenden. Ich habe dein Beispiel versucht und funktioniert nicht für mich. Ich verwende Spring Data REST. Vielen Dank! – drenda