gpt4 book ai didi

java - 使用 Axis 1 和 Tomcat 的自定义 XML 编码器

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:16:10 25 4
gpt4 key购买 nike

关于 this 的文档页面指​​示我可以通过提供具有以下路径的文件来覆盖 Axis 的默认 XML 编码器:

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 打包到一个单独的 jar 中,并将其存储在 myapp.war/WEB-INF/lib 中;还是什么都没有。

我不明白。

最佳答案

使新项目说包含您的自定义编码器的编码器,然后将其制作成 jar。在 jar 下,在 meta -inf 下创建服务文件夹并在其下创建文件 org.apache.axis.components.encoding.XMLEncoder 并在此文件中提及您的类您的编码器名称(完全限定)。将此 jar 放在您的类路径中。

关于java - 使用 Axis 1 和 Tomcat 的自定义 XML 编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6866915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com