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:
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
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?
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