gpt4 book ai didi

java - 无法调用部署在 Weblogic 12c (12.1.3) 远程服务器上的 REST 资源。当它在本地主机上运行时没有任何问题

转载 作者:行者123 更新时间:2023-11-30 07:13:00 25 4
gpt4 key购买 nike

我使用以下工具编写了一个动态 Web 应用程序:

  • AngularJS - REST 调用
  • JQuery - 用于更新饼图的 REST 调用
  • JAX-RS
  • Jersey
  • Weblogic 12c (12.1.3)

这些是 lib 文件夹中的 jar,如下图所示:

Jars in lib folder

REST 资源

@Path("/audit")
public class AuditResource {

private AuditLogService auditLogService = new AuditLogServiceImpl();

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/all")
public List<AuditLog> getAllLog() {
List<AuditLog> allLog = null;
try {

allLog = auditLogService.getAllLog();

} catch(final ApplicationException ex) {
throw ex;
}

if(allLog != null && allLog.isEmpty()) {
throw new ApplicationException("Data not found", Status.NOT_FOUND);
}
return allLog;
}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<welcome-file-list>
<welcome-file>pages/index.html</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>Jersey REST Service</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>my.resources</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>

AngularJS Controller

app.controller('main', ['$scope', '$http', function($scope, $http) {

$scope.allLog = function() {


$http.get("services/audit/all")
.then(function successCallback(response) {

$scope.logs = response.data;

}, function errorCallback(response) {

console.log(response);
});

};

$scope.allLog();
}]);

执行这个 AngularJS Controller 和 jQuery AJAX 调用肯定可以在本地主机上运行,​​没有任何问题,但是当部署在已经运行的远程 Weblogic 服务器上时,它不起作用。有人遇到同样的问题吗?并能解开谜题吗?

当我在远程 weblogic 服务器上运行应用程序时,控制台上会打印消息

http://hostIP:7011/AuditLogView/services/audit/all

Object {data: "Not Found", status: 404, config: Object, statusText: "Not Found"}

另一个问题是log4j无法在远程服务器上写入日志。

log4j 配置和库如下图所示:

log4j configuration

当应用程序在日志中的本地主机上部署时,它会在 Eclipse 控制台中显示警告,尽管 lib 目录中 jersey-bundle-1.19.1.jar 已经存在。如果它不会在本地主机上产生问题,那么我就不那么担心了。

WARNING: 
**********
The application is using ServletContainerInitializer class com.sun.jersey.server.impl.container.servlet.JerseyServletContainerInitializer that is loaded from:file:/C:/Oracle/Middleware/Oracle_Home/oracle_common/modules/jersey-servlet-1.18.jar. This initializer overrides the one available in the system.
**********

最佳答案

Oracle Weblogic 将用自己的版本覆盖嵌入的 jar,可能使用错误的版本。看起来这就是 Jersey 发生的情况。您可以使用名为 /WEB-INF/weblogic.xml 的 weblogic 部署描述符类似于以下内容:

<weblogic-web-app
xmlns="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_2_5.xsd
http://xmlns.oracle.com/weblogic/weblogic-web-app
http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
<container-descriptor>
<prefer-application-packages>
<package-name><!-- put jersey package here, e.g. org.glassfish.jersey.* --></package-name>
</prefer-application-packages>

<prefer-application-resources>
<resource-name><!-- put jersey package here, e.g. org.glassfish.jersey.* --></resource-name>
</prefer-application-resources>
</container-descriptor>
<context-root><!-- your app context --></context-root>
</weblogic-web-app>

您可能需要添加多个 <package-name><resource-name>元素来正确加载所有 jar 。这是使用 weblogic 的痛点之一。

这可能与 log4j、bot the jar 和 log4j.properties 存在类似问题

关于java - 无法调用部署在 Weblogic 12c (12.1.3) 远程服务器上的 REST 资源。当它在本地主机上运行时没有任何问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38876208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com