0

所以,这是我上一个问题的传奇:javax.mail.NoSuchProviderException: when using Liberty 8.5.5.9 with Apache Commons Email 1.4我在Apache Commons Email和 Websphere Liberty Feature JavaMail 1.5 功能 之间有冲突,我已经通过使用<classloader delegation="parentLast" />.

一切正常,直到我开始实现文件上传,通过使用本教程中所述的 jax-rs 2.0配置资源以从 JAX-RS 2.0 中的 HTML 表单提交中接收 multipart/form-data 部分

当我的代码到达以下行时: stream = dataHandler.getInputStream(); streamis type of InputStreamie 我正在尝试对 object 做某事,DataHandler它会引发异常:

[ERROR   ] Error occurred during error handling, give up!
loader constraint violation: loader (instance of com/ibm/ws/classloading/internal/ParentLastClassLoader) previously initiated loading for a different type with name "javax/activation/DataHandler"
[ERROR   ] SRVE0777E: Exception thrown by application class 'org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage:116'
java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: loader constraint violation: loader (instance of com/ibm/ws/classloading/internal/ParentLastClassLoader) previously initiated loading for a different type with name "javax/activation/DataHandler"
    at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:116)
    at [internal classes]
Caused by: org.apache.cxf.interceptor.Fault: loader constraint violation: loader (instance of com/ibm/ws/classloading/internal/ParentLastClassLoader) previously initiated loading for a different type with name "javax/activation/DataHandler"
    at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:163)
    ... 1 more
Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of com/ibm/ws/classloading/internal/ParentLastClassLoader) previously initiated loading for a different type with name "javax/activation/DataHandler"
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at com.ibm.ws.classloading.internal.AppClassLoader.definePackageAndClass(AppClassLoader.java:327)
    at [internal classes]
    at ****.EventsAPI.handleUploadedEventForm(EventsAPI.java:174)
    at ****.EventsAPI.postFormData(EventsAPI.java:114)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.ibm.ws.jaxrs20.server.LibertyJaxRsServerFactoryBean.performInvocation(LibertyJaxRsServerFactoryBean.java:636)
    ... 1 more

事实上,DataHandler作为Apache Commons Email的一部分和DataHandlerIBM 的IAttachmentsee javadoc实现中存在对象,它们是冲突的。

那么,如何解决呢?可以通过配置解决吗?编写自定义类加载器不是可接受的解决方案。

更新:从我的问题中不清楚,但现在我有两个阶段,一个是我使用<classloader delegation="parentLast" />我的邮件工作但文件上传不起作用,没有<classloader delegation="parentLast" />我的邮件不起作用但文件上传工作。当我在 WAS Liberty 8.5.5.7 或 8.5.5.8 上部署我的应用程序时,它工作正常,问题仅存在于 8.5.5.9

4

1 回答 1

0

其实我已经找到了解决这个问题的方法。

首先,我已将范围更改为<scope>provided</scope>具有我的库的所有包含的依赖项。再一次,我使用我的库来发送电子邮件,这取决于:

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-email</artifactId>
        <version>1.4</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
        <scope>provided</scope>
    </dependency>

因此,我的父应用程序需要提供所有必需的依赖项,common-emails并且commons-io. commons-io我已经通过父母添加了pom.xml关于commons-email我已经明确安装了功能javaMail-1.5 的内容,该功能已经有这个库。我也删除了: <classloader delegation="parentLast" />

唯一没有回答的问题为什么之前会发生冲突?如果有人能提供更详细的解释,那就太好了。

于 2016-04-17T16:47:56.287 回答