JAXB не будет принимать CustomEscapeHandler - PullRequest
0 голосов
/ 22 мая 2018

Я работаю над приложением, которое выполняет множество манипуляций с XML, поэтому я пытаюсь заставить JAXB работать в нем.У меня есть следующий класс для CustomEscapeHandler: import com.sun.xml.bind.marshaller.CharacterEscapeHandler;

import java.io.IOException;
import java.io.Writer;

public class CustomEscapeHandler implements CharacterEscapeHandler {
    private static final CharacterEscapeHandler theInstance = new CustomEscapeHandler();

    private CustomEscapeHandler() {
    }

    public static CharacterEscapeHandler getInstance() {
        return theInstance;
    }

    public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException {
        int limit = start + length;
        for(int i = start; i < limit; ++i) {
            char c = ch[i];
            if (c == 38 || c == 39 || c == 60 || c == 62 || c == 13 || c == 34 && isAttVal) {
                if (i != start) {
                    out.write(ch, start, i - start);
                }

                start = i + 1;
                switch(ch[i]) {
                    case '\"':
                        out.write("&quot;");
                        break;
                    case '&':
                        out.write("&amp;");
                        break;
                    case '<':
                        out.write("&lt;");
                        break;
                    case '>':
                        out.write("&gt;");
                        break;
                    case '\'':
                        out.write("&apos;");
                        break;
                }
            }
        }

        if (start != limit) {
            out.write(ch, start, limit - start);
        }
    }
}

Если я использую

jaxbMarshaller.setProperty("com.sun.xml.internal.bind.characterEscapeHandler", CustomEscapeHandler.getInstance());

Iget

javax.xml.bind.PropertyException: property "com.sun.xml.internal.bind.characterEscapeHandler" must be an instance of type com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler, not my.package.CustomEscapeHandler

Так что, если я изменю его на

jaxbMarshaller.setProperty("com.sun.xml.bind.marshaller.CharacterEscapeHandler", CustomEscapeHandler.getInstance());

, я получу

javax.xml.bind.PropertyException: name: com.sun.xml.bind.marshaller.CharacterEscapeHandler value: my.package.CustomEscapeHandler@e2b4f3
    at javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:358)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:527)
    at my.package.util.XmlUtils.convert(XmlUtils.java:39)
    at my.package.util.XmlUtils.convertFormToXml(XmlUtils.java:28)
    at my.package.FormsMain.saveXML(FormsMain.java:362)
    at my.package.FormsMain.saveForms(FormsMain.java:499)
    at my.package.FormsMain.lambda$createWindow$3(FormsMain.java:231)

Глядя наНа стеке трассировки он пытается использовать маршаллер во внутренних пакетах, который также смотрит на декомпилированный код и ожидает, что обработчик escape будет реализацией CharacterEscapeHandler во внутреннем пакете.

Как я могу получитьJAXB не использовать внутреннюю реализацию пакета?

Месяц спустя, все еще не смогли найти решение.Каждый пример, который я вижу в Интернете, имеет расширение внутренней версии CharacterEscapeHandler.

1 Ответ

0 голосов
/ 05 ноября 2018

Проблема здесь заключается в использовании CharacterEscapeHandler из внутреннего пакета com.sun.xml.internal.Это не очень хорошая идея, даже если ваш код будет работать.Вместо этого используйте аналогичный класс из com.sun.xml.bind.marshaller.CharacterEscapeHandler, и это решит проблему для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...