0

I have a server Weblogic 12.1.3, with JAX-RS 2.x installed as a shared library (see e.g. https://docs.oracle.com/middleware/1213/wls/RESTF/use-jersey20-ri.htm#RESTF297). This shared library includes e.g. javax.ws.rs-api-2.0.jar and jersey-media-multipart-2.5.1.jar.

Please notice I am not sure that my webapp is really using this shared library, or it is using the standard JAX-RS 1.x library.

Now I want to upload files in multipart/form-data format, so I guess I need to add this dependency on my project:

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

However, the deploy fails, with error:

java.lang.ClassNotFoundException: org.glassfish.jersey.media.multipart.FormDataContentDisposition

So, I thought I could put my own library within my webapp:

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

In this second case, the deploy fails with the following error:

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

Any idea? Thank you.

luca.vercelli
  • 898
  • 7
  • 24

1 Answers1

1

At last, I got it work. I was missing both configuration in weblogic.xml and web.xml (I didn't know it was necessary 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>

Notice in particular the reference to MultiPartFeature.

Edit

As I thought, the web.xml is not necessary. You can put all the properties inside the Application class. The configuration above is more or less equivalent to the following

@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;
    }

}
luca.vercelli
  • 898
  • 7
  • 24