Я решил проблему, написав свой собственный MessageBodyWriter , который получает HttpHeaders, внедренный в конструктор, который я использую позже при написании ответа. Я включу весь класс, так как он не такой большой.
@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);
}
}
}
Который создает этот отрывок xml со стандартным языком en-US:
<display lang="en_US">
<value>3,286.1</value>
</display>
и этот фрагмент xml, когда в заголовках отправляется язык fr-FR:
<display lang="fr_FR">
<value>3 286,1</value>
</display>
Этот подход все еще не идеален, поскольку теперь мне нужно написать аналогичный MessageBodyWriter для JSON или добавить поддержку JSON для этого MessageBodyWriter. Кроме того, я предполагаю, что провайдеры JAXB по умолчанию вносят некоторые изменения, которыми я не пользуюсь.