Я работаю в среде веб-службы JAXWS / JAXB. JAXWS «из коробки» использует JAXB для маршалинга / деинсталляции полезных нагрузок веб-сервиса.
У меня также есть требование проверять все полезные данные запросов и ответов.
Мне нужно компактное и сжатое маршалированное представление полезной нагрузки для аудита (в качестве неуместного примечания - я выполняю аудит с использованием java.util.concurrent.BlockingQueue и некоторых потребительских потоков для помещения пакетов данных аудита в источник данных аудита ).
У меня есть двоичный контент (mtom), включенный в некоторые полезные нагрузки ответов веб-службы, но я НЕ хочу проводить их аудит, потому что сериализованный base64 будет слишком большим.
Таким образом, мне нужно создать маршаллер (исключительно для аудита), который во всех случаях будет очищать двоичный контент, но затем НЕ очищать для основной цели распределения полезных нагрузок ответа веб-службы. Я делаю XSD для Java XJC. Мне нужно использовать одно и то же пространство имен XSD / JAXB для обоих контекстов / маршаллеров.
Преобразователь типов Java:
<jxb:javaType name=""
parseMethod="com.xxx.xxx.ws.converter.XXXLongConverter.parseXXXLong"
printMethod="com.xxx.xxx.ws.converter.XXXLongConverter.printXXXLong" />
не будет работать, потому что 1. Мне нужно отменить регистрацию адаптера http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/Marshaller.html#setAdapter%28java.lang.Class,%20A%29
для маршаллера, и я не думаю, что у меня есть крюк для JAXWS. 2. Я не могу гарантировать имя класса, которое JAXB решит создать, чтобы отменить его регистрацию.
Я создал свой собственный XMLAdapter и использовал плагин annox jaxb
но на самом деле это не сработало по тем же причинам, что и вышесказанное.
Обновление: теперь я попытался вручную и рефлексивно пройтись по полезной нагрузке (подлежащей аудиту) перед сортировкой, чтобы очистить двоичные данные, но это должно быть слишком большой болью для того, что оно того стоило.
Следует также отметить, что для краткости аудита я использую джерси Сериализация JSON с поддержкой JAXB
но я не думаю, что это убирает или увеличивает мою базовую проблему:
Как я могу очистить данные в одном маршаллере / демаршаллере, но не в другом, но в обоих источниках с одинаковым контекстом JAXB?
ОБНОВЛЕНИЕ: Никогда не придумал элегантного способа сделать это. На самом деле не возможно на данном этапе с такими структурами, как они есть. ОБНОВЛЕНИЕ: Не правда. Расширение AttachmentMarshaller (мне это очень нравится и я буду его использовать) или создание XmlAdapter с учетом потребностей будет работать для конкретного маршаллера аудита, как ответит @Blaise ниже.
ОБНОВЛЕНИЕ: Если я могу сделать еще один шаг, чтобы завершить мой вариант использования ... Я упомянул выше, что для краткости аудита я хотел бы выполнить серию Json для JSONJAXBContext с использованием трикотажа apis, в частности, используя JSONMarshaller, но интерфейс не определяет setAdapter и setAttachmentMarshaller. Выход JSONJAXBContext.createJSONMarshaller () является реализацией JSONMarshallerImpl , которая определяет эти методы. Я буду неохотно приводить в impl, чтобы я мог установить свой собственный маршаллер вложения.