问题描述
我有一个服务器 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.jar
和 jersey-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;
}
}