私は後でレスポンスを書くときに使うコンストラクタに注入されたHttpHeadersを受け取る私自身のMessageBodyWriterを書く問題を解決しました。それはそれほど大きくないので、私はクラス全体を含めます。 FR-FRのロケールがヘッダに送信され
<display lang="en_US">
<value>3,286.1</value>
</display>
と、このXMLの抜粋:
<display lang="fr_FR">
<value>3 286,1</value>
</display>
EN-USのデフォルトロケールで、このXMLの抜粋を生成
@Produces(MediaType.APPLICATION_XML)
@Provider
public class JaxbPersonalizationProvider implements MessageBodyWriter<Object> {
private HttpHeaders requestHeaders;
private Providers providers;
public JaxbPersonalizationProvider(@Context HttpHeaders requestHeaders, @Context Providers providers) {
this.requestHeaders = requestHeaders;
this.providers = providers;
}
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return type.getAnnotation(XmlRootElement.class) != null && mediaType.equals(MediaType.APPLICATION_XML_TYPE);
}
@Override
public long getSize(Object t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return -1;
}
@Override
public void writeTo(Object t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException,
WebApplicationException {
Locale locale = If.first(this.requestHeaders.getAcceptableLanguages(), Locale.US);
NumberFormat formatter = NumberFormat.getNumberInstance(locale);
formatter.setMaximumFractionDigits(1);
Marshaller marshaller;
try {
JAXBContext jc = JAXBContext.newInstance(TrackInfo.class);
marshaller = jc.createMarshaller();
marshaller.setAdapter(QuantityXmlAdapter.class, new QuantityXmlAdapter.Builder().locale(locale).build());
marshaller.setAdapter(NumberPersonalizedXmlAdapter.class, new NumberPersonalizedXmlAdapter.Builder()
.formatter(formatter).build());
marshaller.marshal(t, entityStream);
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
}
このアプローチはまだ理想的ではありません。JSON用に同様のMessageBodyWriterを作成するか、このMessageBodyWriterにJSONサポートを追加する必要があります。また、デフォルトのJAXBプロバイダが私が利用していない調整を行っていると仮定します。