Weblogic 12.1.3 + JAX-RS 2 + jersey multipart

问题描述

我有一个服务器 Weblogic 12.1.3,安装了 JAX-RS 2.x 作为共享库(参见例如 https://docs.oracle.com/middleware/1213/wls/RESTF/use-jersey20-ri.htm#RESTF297)。这个共享库包括例如javax.ws.rs-api-2.0.jarjersey-media-multipart-2.5.1.jar

请注意,我不确定我的 web 应用程序是否真的在使用这个共享库,或者它是否使用标准的 JAX-RS 1.x 库。

现在我想上传 multipart/form-data 格式的文件,所以我想我需要在我的项目中添加这个依赖项:

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.5.1</version>
        <scope>provided</scope>
    </dependency>

但是,部署失败,出现错误

java.lang.classNotFoundException: org.glassfish.jersey.media.multipart.FormDataContentdisposition

所以,我想我可以将自己的库放在我的 web 应用程序中:

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.5.1</version>
    </dependency>

在第二种情况下,部署失败并出现以下错误

java.lang.classNotFoundException: org.glassfish.jersey.ExtendedConfig

有什么想法吗?谢谢。

解决方法

我终于搞定了。我在 weblogic.xml 和 web.xml 中都缺少配置(我不知道 web.xml 是必需的)。

Weblogic.xml:

<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.9/weblogic-web-app.xsd">
    
    <!-- Questo è per referenzialre la shared library jax-rs 2.x -->
    <wls:library-ref>
        <wls:library-name>jax-rs</wls:library-name>
        <wls:specification-version>2</wls:specification-version>
        <wls:implementation-version>2.5.1</wls:implementation-version>
        <wls:exact-match>false</wls:exact-match>
    </wls:library-ref>
    
    <wls:container-descriptor>
        <wls:prefer-application-packages>
            <!-- apis -->
            <wls:package-name>javax.ws.rs.*</wls:package-name>
            <!-- guava -->
            <wls:package-name>com.google.common.*</wls:package-name>
            <!-- jersey1 providers -->
            <wls:package-name>com.sun.jersey.*</wls:package-name>
            <!-- media providers -->
            <wls:package-name>org.eclipse.persistence.jaxb.rs.*</wls:package-name>
            <wls:package-name>org.codehaus.jackson.jaxrs.*</wls:package-name>
            <!-- wls -->
            <wls:package-name>weblogic.jaxrs.api.client.*</wls:package-name>
            <wls:package-name>weblogic.jaxrs.internal.api.client.*</wls:package-name>
            <wls:package-name>weblogic.jaxrs.dispatch.*</wls:package-name>
            <wls:package-name>weblogic.jaxrs.monitoring.util.*</wls:package-name>
        </wls:prefer-application-packages>
    </wls:container-descriptor>
    <wls:context-root>uploader</wls:context-root>
    
</wls:weblogic-web-app>

Web.xml:

<servlet>
    <servlet-name>JAX-RS</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer
    </servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>mypackage.jaxrs.JAXRSApplication
        </param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.media.multipart.MultiPartFeature
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>JAX-RS</servlet-name>
    <url-pattern>/v1/*</url-pattern>
</servlet-mapping>

特别注意对 MultiPartFeature 的引用。

编辑

正如我所想,web.xml 不是必需的。您可以将所有属性放在 Application 类中。上面的配置或多或少相当于下面的

@ApplicationPath("/v1")
public class JAXRSApplication extends Application {

    @Override
    public Map<String,Object> getProperties() {

        Map<String,Object> properties = new HashMap<>();

        properties.put("jersey.config.server.provider.packages","mypackage");
        properties.put("jersey.config.server.provider.classnames","org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.media.multipart.MultiPartFeature");

        return properties;
    }

}