Po pierwsze, sposobem na sformatowanie danych wyjściowych XML jest ustawienie właściwej właściwości na urządzeniu Marshaller (zwykle JAXB podczas pracy z CXF, co jest w porządku, ponieważ JAXB wykonuje dobrą pracę). Oznacza to, że gdzieś idziesz mieć coś w ten sposób:
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Problemem jest to, że nie koniecznie chcą mieć wszystko wyjście sformatowane; dodaje trochę do kosztów ogólnych. Na szczęście, jesteś już wytwarzania wyraźny Response
, więc możemy po prostu użyć więcej cech, które:
Marshaller marshaller = JAXBContext.newInstance(entity.getClass()).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter sw = new StringWriter();
marshaller.marshal(entity, sw);
return Response.ok(sw.toString(), MediaType.APPLICATION_XML_TYPE).build();
Inną metodą jest wymieniona w this JIRA issue (sama zamknięta, ale to nie jest tak wiele kwestii do ty):
Rozwiązaniem jest zarejestrowanie klasę obsługi wyjściowy, który może sprawdzić, co niestandardowe zapytania służy do żądania dodatkowego wcięcia:
http://svn.apache.org/repos/asf/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/FormatResponseHandler.java
JAXBElementProvider i JSONProvider są obsługiwane przez program JAXB Marshaller, dlatego domyślnie sprawdzają właściwość Marshaller.JAXB_FORMATTED_OUTPUT w bieżącej wiadomości.
Prowadzi to do kodu tak:
public class FormattedJAXBInterceptor extends AbstractPhaseInterceptor<Message> {
public FormattedJAXBInterceptor() {
super(Phase.PRE_STREAM);
}
public void handleMessage(Message message) {
message.put(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
}
public void handleFault(Message messageParam) {
message.put(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
}
}
CXF witryny discusses registration of interceptors.
Napisałem powyżej, że wiedziałem o tej opcji. Chciałem tego uniknąć, ponieważ przekazanie jednostki do 'Response.ok (entity)' powoduje automatyczne ustawienie. Czy mówisz, że ten ręczny fragment kodu jest jedynym sposobem wymuszenia formatowania i nie ma sposobu, aby przekazać to do ResponseBuilder? – user219882
Możesz spróbować zarejestrować komponent bean "MessageBodyWriter", który koduje powyższą lukę. Następnie możesz po prostu zwrócić 'Cokolwiek', tak jak w przypadku standardowej serializacji. Nigdy nie byłem zbyt zainteresowany robieniem tego dla generowania XML (zbyt blisko domyślnego silnika serializacji), ale może w tym przypadku zadziałać.Możliwym wadą jest to, że * wszystkie * zwrócone wartości tego typu będą serializowane w ten sposób (chyba że dodasz pewne kluczowanie do niestandardowej adnotacji, przypuszczam) ... –
Zobacz także http: //cxf.547215.n5.nabble. com/Formatting-binding-output-Json-amp-Xml-td565786.html, ale nie wiem, jak istotne jest to dla CXF 2.5 ... –