Документация на этой странице указывает, что я могу переопределить 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; все еще ничего.
Я не понимаю.