Zuordnung Dateiendung-content-Typen in Apache CXF JAX-RS
JAX-RS bietet eine wunderbare Möglichkeit zur Angabe von content-Typen in @Produces
, und der Rahmen bestimmt automatisch die besten Inhalte geben, die vom client die HTTP - Accept
- header und, Oh Wunder, sogar konvertieren Sie Ihre Objekt zu diesem Typ (z.B. XML mit Hilfe von JAXB-oder JSON-über Jackson) bei Rückgabe von Informationen an den Anrufer.
Mein (Arbeits -) client, da die Kunden oft tun, eine einfache Aufgabe schwieriger anfordern ich den Inhaltstyp angeben, die durch die Erweiterung in der URL, z.B. api/widgets.json
. Das würde mich zwingen, mich haben verschiedene getWidgetsXXX()
Methoden, mit @Produces("application/json")
, eine andere mit @Produces("application/xml")
usw.
Aber ich bin mit Apache CXF und ich war erfreut zu finden, ich könnte konfigurieren CXF zu Karte verschiedene extensions zu content-Typen über die jaxrs.extensions
init-parameter!
<!-- registers extension mappings -->
<init-param>
<param-name>jaxrs.extensions</param-name>
<param-value>
xml=application/xml
json=application/json
</param-value>
</init-param>
Aber ich finde absolut keine Dokumentation darüber, wie das funktioniert in der realen Welt. Ich naiv gedacht, ich könnte einfach kommentieren eine Methode mit einem Pfad mit einer Verlängerung und es würde imitieren die Accepts
header:
@Path("/widgets.{extension}")
@GET
@Produces({ "application/json", "application/xml" })
public List<Widget> getWidgets();
So, ich nenne es mit api/widgets.json
, und es gibt XML! Das ist besonders merkwürdig, da JAX-RS gibt an, dass der Standard-content-Typ ist der erste aufgeführt.
Wo kann ich erfahren, wie CXF Dateiendung-content-type-mapping?
P. S. ich bin nicht mit Spring.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen der folgenden, die in Ihrer
<jaxrs:server>
funktioniert:Quelle: http://cxf.apache.org/docs/jax-rs.html#JAX-RS-Debugging
Weiß nicht, ob das helfen Sie oder nicht, aber ich war auch vor dem gleichen Problem etwas vorstellen wie das in meinem JAX-RS services. Ich erreicht diese Funktionalität mit JAX-RS_Content_Negotiation Folgende Lage hat details über Sie.
https://docs.jboss.org/resteasy/docs/3.0.6.Final/userguide/html/JAX-RS_Content_Negotiation.html
Müssen Sie nur die Zuordnung der Medientypen mit den Werten, die Sie wollen
nun kann ich den Zugriff auf meine Dienste wie das und die Antwort ist nach der Erweiterung, die ich am Ende
http://localhost:8080/RESTfulExample/rest/message/second/bill.json
können Sie setzen .xml-ODER .json an das Ende der url und Dienstleistungen erzeugen Antwort entsprechend.
In Ihrer situation, ich würde erklären, dass die Methode von @Erzeugt den content-type
*/*
(d.h., eine vollständige wildcard) und dann die content-negotiation mich. Sie würde wahrscheinlich auf der Suche an einer Methodensignatur Aussehen:Bietet Ihnen Zugang zu sowohl den gewünschten Dateinamen — eine Möglichkeit, zu erraten, den Medien-Typ zu liefern — und den vollständigen Satz von HTTP-Headern (Hinweis: benutzen Sie
headers.getAcceptableMediaTypes()
), die in die andere Richtung. Wie, um die balance der beiden ist wahrscheinlich "interessant". (Den code habe ich zu tun, es ist sehr spezifisch auf meine app-internen Modell, so ist nicht wahrscheinlich für Sie nützlich sein.) Sie dann das Ergebnis durch den Bau einerResponse
, die Ihnen ganz genaue Kontrolle über das, was der Kunde zurück bekommt.Ja, das ist mehr Arbeit, als andere CXF handhaben das alles für Sie (es erzeugt normalerweise eine Menge boilerplate zu tun, all dieses Zeug), aber in einem komplexen Fall werden Sie froh, dass der Kontrolle.
Die Erweiterung ahmt die
Accept
Kopf, als Sie Ahnen. Allerdings müssen Sie nicht deklarieren Sie die Erweiterung in der@Path
Anmerkung:Können Sie dann rufen
widgets.xml
oderwidgets.json