JAX-RS offre un modo meraviglioso per specificare i tipi di contenuto in @Produces
e il framework determinerà automaticamente il miglior tipo di contenuto dall'intestazione HTTP Accept
del client e, meraviglia delle meraviglie, anche converti il tuo oggetto in quel tipo (es. XML usando JAXB o JSON usando Jackson) quando restituisci informazioni al chiamante.Mapping dei tipi di contenuto di estensione in Apache CXF JAX-RS
Il mio client (di lavoro), come spesso fanno i clienti, ha reso più semplice un lavoro richiedendo di specificare il tipo di contenuto dall'estensione nell'URL, ad es. api/widgets.json
. Questo mi avrebbe costretto ad avere vari getWidgetsXXX()
metodi, uno con @Produces("application/json")
, un altro con @Produces("application/xml")
, ecc
ma sto usando Apache CXF e sono stato felice di scoprire che potevo configure CXF per mappare varie estensioni per i tipi di contenuto che utilizzano il jaxrs.extensions
parametro init!
<!-- registers extension mappings -->
<init-param>
<param-name>jaxrs.extensions</param-name>
<param-value>
xml=application/xml
json=application/json
</param-value>
</init-param>
Ma non riesco a trovare assolutamente nessuna documentazione su come funziona nel mondo reale. Ho ingenuamente pensato che avrei potuto solo annotare un metodo con un percorso con un'estensione e sarebbe imitare il Accepts
intestazione:
@Path("/widgets.{extension}")
@GET
@Produces({ "application/json", "application/xml" })
public List<Widget> getWidgets();
Così mi chiamano utilizzando api/widgets.json
, e restituisce XML! Il che è particolarmente strano, perché JAX-RS specifica che il tipo di contenuto predefinito è il primo elencato.
Dove posso trovare informazioni su come utilizzare la mappatura del tipo di contenuto dell'estensione CXF?
P.S. Non sto usando Spring.
Grazie per il suggerimento. La tua risposta potrebbe rivelarsi utile --- ma temo che non risponda alla domanda. :( –