添加 eclipselink 工件时在 Weblogic 12.2.1 中自动注册 Jax-RS
Automatic Jax-RS registration in Weblogic 12.2.1 when adding eclipselink artifact
我在最新的 Weblogic 服务器版本 12.2.1.2 中观察到一个非常奇怪的行为。
当将 eclipselink 依赖项添加到您的 Java servlet 应用程序时,Weblogic 服务器将自动触发 /resources/* 路径下的 Jax-RS Jersey REST 服务。
为了消除疑虑,我创建了一个非常简单的 helloworld war 文件。可以按照此页面 (http://geekabyte.blogspot.com/2015/07/how-to-create-war-files-with-intellij.html)
中的说明创建示例 war 文件
如果您遵循上述说明,基本上您唯一的依赖是
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
而Helloworld作为唯一的class应用。您可以将它部署到任何服务器,它 运行 就好了。
现在您将另一个依赖项添加到您的 maven pom 文件。它是 eclipselink 神器,如下所示:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.2</version>
</dependency>
部署 war 文件时,服务器将记录以下内容:
<May 23, 2017, 2:42:47,343 PM MST> <Warning> <JAXRSIntegration> <BEA-2192511>
<The list of resource packages: org.eclipse.persistence.jpa.rs.exceptions;org.eclipse.persistence.jpa.rs.resources;org.eclipse.persistence.jpa.rs.resources.unversioned>
您将从您的 Weblogic 管理控制台中看到以下内容
这样做的影响是,如果您按照约定将所有 javascript 和 css 文件存储在 /resources/ 路径下,而不是提供这些静态文件,服务器将尝试通过 JAX-RS 服务处理这些请求,最终返回 404 未找到。
我尝试了不同的配置:不同的服务器、不同版本的 Weblogic 服务器、Toplink 而不是 eclipselink、不同版本的 eclipselink,以及其他一些我在这里为了简单起见不会提及的东西。显然,我们在 Weblogic 的先前版本中有一个工作应用程序 运行ning,我们需要将其迁移到最新版本的 Weblogic。花了很多天才将问题定位到这个依赖项。无论如何,这个问题只存在于 Weblogic 12.2.* 与任何版本的 eclipselink 作为依赖项。
我对每个人的明显问题是:为什么会这样?有没有人遇到过同样的问题?你的解决方案是什么?
Jersey 会扫描@Provider 注解来判断这个包是算rest resources还是provider。
您不需要将 eclipse.jar 添加到您的 webapp,因为 WLS 已经在类路径中包含它。
只是为了澄清我的错误和解决方案,我在 Weblogic 12.2.1.2 中没有这个错误(/resources/* 路径),但我在 12.2.1.3 中确实有这个错误,我注意到这个新路径 /resoures/ * 在我的组织升级后(到 12.2.1.3)。
因为我在 war 中包含 eclipselink.jar,所以我尝试了 "oracode" 的建议,所以我在我的 POM 中指定了范围 "provided",然后我构建新的war,但不影响结果。我仍然遇到问题。
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.1</version>
<scope>provided</scope>
</dependency>
但是,对我有用的解决方案是:在我的 web.xml 中添加 init-param 部分。
在我的组织中,我们有 N 个 Web 服务,所以我开始比较它们,我注意到其中一个服务(这个 /resources/* 失败的服务)没有初始化-param 部分明确指定,所以我添加了它,我的网络服务现在在 /*.
下正常工作
<servlet>
<servlet-name>jersey</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.xxxxxx.xxx.xxx.xxx</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
我在最新的 Weblogic 服务器版本 12.2.1.2 中观察到一个非常奇怪的行为。 当将 eclipselink 依赖项添加到您的 Java servlet 应用程序时,Weblogic 服务器将自动触发 /resources/* 路径下的 Jax-RS Jersey REST 服务。
为了消除疑虑,我创建了一个非常简单的 helloworld war 文件。可以按照此页面 (http://geekabyte.blogspot.com/2015/07/how-to-create-war-files-with-intellij.html)
中的说明创建示例 war 文件如果您遵循上述说明,基本上您唯一的依赖是
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
而Helloworld作为唯一的class应用。您可以将它部署到任何服务器,它 运行 就好了。
现在您将另一个依赖项添加到您的 maven pom 文件。它是 eclipselink 神器,如下所示:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.2</version>
</dependency>
部署 war 文件时,服务器将记录以下内容:
<May 23, 2017, 2:42:47,343 PM MST> <Warning> <JAXRSIntegration> <BEA-2192511>
<The list of resource packages: org.eclipse.persistence.jpa.rs.exceptions;org.eclipse.persistence.jpa.rs.resources;org.eclipse.persistence.jpa.rs.resources.unversioned>
您将从您的 Weblogic 管理控制台中看到以下内容
这样做的影响是,如果您按照约定将所有 javascript 和 css 文件存储在 /resources/ 路径下,而不是提供这些静态文件,服务器将尝试通过 JAX-RS 服务处理这些请求,最终返回 404 未找到。
我尝试了不同的配置:不同的服务器、不同版本的 Weblogic 服务器、Toplink 而不是 eclipselink、不同版本的 eclipselink,以及其他一些我在这里为了简单起见不会提及的东西。显然,我们在 Weblogic 的先前版本中有一个工作应用程序 运行ning,我们需要将其迁移到最新版本的 Weblogic。花了很多天才将问题定位到这个依赖项。无论如何,这个问题只存在于 Weblogic 12.2.* 与任何版本的 eclipselink 作为依赖项。
我对每个人的明显问题是:为什么会这样?有没有人遇到过同样的问题?你的解决方案是什么?
Jersey 会扫描@Provider 注解来判断这个包是算rest resources还是provider。 您不需要将 eclipse.jar 添加到您的 webapp,因为 WLS 已经在类路径中包含它。
只是为了澄清我的错误和解决方案,我在 Weblogic 12.2.1.2 中没有这个错误(/resources/* 路径),但我在 12.2.1.3 中确实有这个错误,我注意到这个新路径 /resoures/ * 在我的组织升级后(到 12.2.1.3)。
因为我在 war 中包含 eclipselink.jar,所以我尝试了 "oracode" 的建议,所以我在我的 POM 中指定了范围 "provided",然后我构建新的war,但不影响结果。我仍然遇到问题。
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.1</version>
<scope>provided</scope>
</dependency>
但是,对我有用的解决方案是:在我的 web.xml 中添加 init-param 部分。
在我的组织中,我们有 N 个 Web 服务,所以我开始比较它们,我注意到其中一个服务(这个 /resources/* 失败的服务)没有初始化-param 部分明确指定,所以我添加了它,我的网络服务现在在 /*.
下正常工作<servlet>
<servlet-name>jersey</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.xxxxxx.xxx.xxx.xxx</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>