Пользовательский XML-кодировщик с Axis 1 и Tomcat - PullRequest
3 голосов
/ 29 июля 2011

Документация на этой странице указывает, что я могу переопределить XML-кодировщик Axis по умолчанию, предоставив файл с этим путем:

myapp.war/META-INF/services/org.apache.axis.components.encoding.XMLEncoder

Содержимое этого файла:

com.myapp.CustomEncoder

Где com.myapp.Customer находится в myapp.war / WEB-INF / classes / com / myapp / CustomEncoder.class.

Обратите внимание, что myapp.war фактически развертывается как полный каталог при развертывании, но я не думаю, что это должно иметь значение.

В любом случае, это не работает на Apache Tomcat 7.0, но, как ни странно, работает на JBoss 4.2.3. В качестве альтернативы я попытался установить системное свойство, добавив его в сценарий запуска Tomcat:

-Dorg.apache.axis.components.encoding.XMLEncoder=com.myapp.CustomEncoder

Все еще не вижу, как вызывается мой код CustomEncoder, и только на Tomcat. Почему это должно работать на JBoss, а не Tomcat? Чем-то отличается классовая дорожка на Tomcat? Как я могу сделать эту работу?

Спасибо.

---- Обновление ----

Поскольку было упомянуто, исходный код, который, кажется, загружает пользовательский поставщик, существует в org.apache.axis.components.encoding.XMLEncoderFactory:

public static final String ENCODING_UTF_8 = "UTF-8";
public static final String ENCODING_UTF_16 = "UTF-16";
public static final String DEFAULT_ENCODING = ENCODING_UTF_8;

private static Map encoderMap = new HashMap();
private static final String PLUGABLE_PROVIDER_FILENAME = "org.apache.axis.components.encoding.XMLEncoder";

static {
    encoderMap.put(ENCODING_UTF_8, new UTF8Encoder());
    encoderMap.put(ENCODING_UTF_16, new UTF16Encoder());
    encoderMap.put(ENCODING_UTF_8.toLowerCase(), new UTF8Encoder());
    encoderMap.put(ENCODING_UTF_16.toLowerCase(), new UTF16Encoder());
    try {
        loadPluggableEncoders();
    } catch (Throwable t){
        String msg=t + JavaUtils.LS + JavaUtils.stackToString(t);
        log.info(Messages.getMessage("exception01",msg));
    }
}

...

/**
 Look for file META-INF/services/org.apache.axis.components.encoding.XMLEncoder
 in all the JARS, get the classes listed in those files and add them to 
 encoders list if they are valid encoders. 

 Here is how the scheme would work.

 A company providing a new encoder will jar up their encoder related
 classes in a JAR file. The following file containing the name of the new 
 encoder class is also made part of this JAR file. 

 META-INF/services/org.apache.axis.components.encoding.XMLEncoder

 By making this JAR part of the webapp, the new encoder will be 
 automatically discovered. 
 */
private static void loadPluggableEncoders() {
    ClassLoader clzLoader = XMLEncoder.class.getClassLoader();
    ClassLoaders loaders = new ClassLoaders();
    loaders.put(clzLoader);
    DiscoverServiceNames dsn = new DiscoverServiceNames(loaders);
    ResourceNameIterator iter = dsn.findResourceNames(PLUGABLE_PROVIDER_FILENAME);
    while (iter.hasNext()) {
        String className = iter.nextResourceName();
        try {
            Object o = Class.forName(className).newInstance();
            if (o instanceof XMLEncoder) {
                XMLEncoder encoder = (XMLEncoder) o;
                encoderMap.put(encoder.getEncoding(), encoder);
                encoderMap.put(encoder.getEncoding().toLowerCase(), encoder);
            }
        } catch (Exception e) {
            String msg = e + JavaUtils.LS + JavaUtils.stackToString(e);
            log.info(Messages.getMessage("exception01", msg));
            continue;
        }
    }
}

Ради интереса я попытался упаковать META-INF / services / org.apache.axis.components.encoding.XMLEncoder в отдельный файл и сохранить его в myapp.war / WEB-INF / lib; все еще ничего.

Я не понимаю.

1 Ответ

0 голосов
/ 28 ноября 2017

Создайте новый проект, скажем, кодировщик, содержащий ваш пользовательский кодировщик, затем сделайте его jar.Under jar в папке meta -inf create services и под ним создайте файл org.apache.axis.components.encoding.XMLEncoder и в этом файле укажите свой классимя вашего кодировщика (полностью определено). поместите этот jar в путь к классу.

...