小编典典

在Weblogic12C上访问SpringBoot示例应用程序的全新部署时遇到问题

spring-boot

将示例SpringBoot应用程序部署到Weblogic12C后,我无法访问它。使用springBoot嵌入式Tomcat服务器,它可以正常工作。

使用SpringBoot嵌入式Tomcat安装和测试:一切正常

重现步骤:按照以下步骤获取springBoot“入门”应用程序代码:https ://spring.io/guides/gs/spring-
boot/

  • git clone https://github.com/spring-guides/gs-spring-boot.git
  • cd gs-spring-boot / complete /(我们将使用gr-spring-boot / complete目录,这样您就不必浏览上面的“入门”页面(在“ complete”中为您完成的所有更改”)。
  • 打开文件gs-spring-boot / complete / build.gradle并在其他“应用插件”条目下添加“ apply plugin:’war’”

此时,您可以通过运行gradle“
bootRun”任务(在嵌入式Tomcat服务器中启动该应用程序)来验证一切正常。Tomcat启动后,浏览至localhost:8080 /,然后看到“
Spring Boot的问候!”。

现在让我们在Weblogic 12C上安装它

  • 运行“ gradle war”(再次从gs-spring-boot / complete /工作),您现在将在gs-spring-boot \ complete \ build \ libs \ complete.war下有一个war文件。
    • 转到您的weblogic12C控制台。我没有对WL12C进行更改,因此控制台位于localhost:7001 / console。注意:一周前,我从Oracle网站下载了WL12C开发人员版本。下载后,我没有对其进行任何更改。WL12C下载的开发版本要求我们将其指向已经安装的JDK。我的WL12C使用Java版本:

Java版本“ 1.7.0_45” Java™SE运行时环境(内部版本1.7.0_45-b18)Java
HotSpot(TM)服务器VM(内部版本24.45-b08,混合模式)

* 在控制台中时,部署war文件:
* 点击“部署”
* 点击“安装”
* 浏览到您的“ gs-spring-boot \ complete \ build \ libs”目录 
* 选择complete.war旁边的单选按钮,然后单击下一步
* 选择“作为应用程序安装”,然后单击下一步
* 将所有选项保留为[仅DD,使用默认设置,使用相同的可访问性],然后单击下一步
* 点击完成

此时,您将看到该应用程序已正确部署:-再次单击“部署”,并看到列出了您的“完整” springBoot应用程序并且处于活动状态-
单击“完整”并在此页面上注意到:“上下文根:/完成”。注意:weblogic文档说,如果在weblogic.xml中没有定义上下文根,则它将使用war文件的名称(减去.war)

现在,问题是:得到403:

如果您尝试在localhost:7001 / complete处访问springBoot应用程序,则会收到403 !!!!

    Error 403--Forbidden
    From RFC 2068 Hypertext Transfer Protocol -- HTTP/1.1:
    10.4.4 403 Forbidden
    The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. This status code is commonly used when the server does not wish to reveal exactly why the request has been refused, or when no other response is applicable.

好的,让我们做最后的更改(我在这里钓鱼,也许weblogic确实想要一个weblogic.xml):

  • 创建目录:gs-spring-boot \ complete \ src \ main \ webapp \ WEB-INF \
  • 创建此文件:gs-spring-boot \ complete \ src \ main \ webapp \ WEB-INF \ weblogic.xml
  • 编辑weblogic.xml以包含:
        <?xml version="1.0" encoding="UTF-8"?>
    <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_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">
        <wls:weblogic-version>12.1.1</wls:weblogic-version>
        <wls:context-root>testApp</wls:context-root>
    </wls:weblogic-web-app>
  • 现在回到您的weblogic控制台(localhost:7001 / console)

  • 转到“网络应用程序”,然后选中“完成”旁边的复选框,然后点击“删除”

  • 重新启动您的weblogic12C服务器(只是偏执)
  • 再次运行“ gradle clean”然后“ gradle war”任务以生成新的war文件
  • 打开war文件(使用winzip或其他方法),并确认war文件现在具有WEB-INF / weblogic.xml
  • 转到控制台以部署新的war文件(使用与上述相同的步骤)
  • 确认该应用程序现在已部署并且具有/ testApp的contextRoot(在weblogic.xml中定义)
  • 浏览到localhost:7001 / testApp /

403仍然在那里。所以:

  • weblogic确实了解此应用程序(返回403)。因为如果它不知道该应用程序,它将返回404(通过转到localhost:7001 / doesNotExist进行尝试,您将得到404)
  • 但看起来WL12C不会将请求路由到spring。过去,我们会在web.xml中定义一堆东西,但是如今,使用javaConfig和SpringBoot,这应该自动完成。
    • 注意:因为SpringBoot使用JavaConfig(Servlet3),所以我们不能使用低于weblogic12C的任何东西(这是最新的)

我尝试过的另一件事:更改RequestMapping

在上面的示例代码中,打开文件gs-spring-boot \ complete \ src \ main \ java \ hello \
HelloController.java并替换:

@RequestMapping("/")

有了这个:

@RequestMapping("pierre.htm")

现在,如果浏览至(请记住weblogic.xml,请将context-root定义为/ testApp):

  • 本地主机:7001 / testApp / pierre.htm,您将获得404
  • 本地主机:7001 / testApp /您将获得403

而且,如果您尝试使用“ gradle bootrun”运行tomcat,则可以很好地进行此操作:localhost:8080 /
pierre.htm(您将获得“ SpringBoot的问候!”)。

因此,这产生了以下提示:

  • Weblogic确实了解/ testApp
  • Weblogic不知道/testApp/pierre.htm是什么。就像从未将其配置为RequestMapping一样。
  • 在Weblogic上缺少一些“弹簧接线”。

这就是我被困住的地方…谁能想到我缺少的JavaConfig才能在Weblogic上正常工作?任何帮助,不胜感激。谢谢!!

如果有人来这里,要使其比阅读下面的所有评论更简单,请按以下步骤进行操作:

  • 从SpringBoot示例应用程序开始,然后从此处git“完整”解决方案:spring.io/guides/gs/convert-jar-to-war/
  • 更新类WebInitializer,以实现WebApplicationInitializer。因此,从此更改:
public class WebInitializer extends SpringBootServletInitializer {

对此:

public class WebInitializer extends SpringBootServletInitializer implements WebApplicationInitializer {
  • 创建一个新文件src / main / webapp / WEB-INF / weblogic.xml并将其内容放入其中:
        <?xml version="1.0" encoding="UTF-8"?>
    <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_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">
        <wls:weblogic-version>12.1.1</wls:weblogic-version>
        <wls:context-root>helloApp</wls:context-root>
        <wls:container-descriptor>
            <wls:prefer-application-packages>
                <wls:package-name>org.slf4j.*</wls:package-name>
            </wls:prefer-application-packages>
        </wls:container-descriptor>
    </wls:weblogic-web-app>
* dle战
* 部署到Weblogic12C
* 它现在应该可以工作了:)非常感谢Dave Syer和Evgeni!

先前的解决方案(此处为后代保留)

  • 从SpringBoot示例应用程序开始,然后从此处git“完整”解决方案:spring.io/guides/gs/convert-jar-to-war/

    • 在示例应用程序的程序包“ hello”中,添加一个新的公共类HelloWebXml实现WebApplicationInitializer
    • 从org.springframework.boot.context.web.SpringBootServletInitializer中获取所有代码,并将其复制到HelloWebXml中,但更改以下几行:

受保护的SpringApplicationBuilder configure(SpringApplicationBuilder
application){返回应用程序;}

对此:

        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
          return application.sources(Application.class);
        }
  • 将类org.springframework.boot.context.web.ErrorPageFilter复制到示例应用程序中的“ hello”包中
  • 创建一个新文件src / main / webapp / WEB-INF / weblogic.xml并将其内容放入其中:
        <?xml version="1.0" encoding="UTF-8"?>
    <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_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">
        <wls:weblogic-version>12.1.1</wls:weblogic-version>
        <wls:context-root>helloApp</wls:context-root>
        <wls:container-descriptor>
            <wls:prefer-application-packages>
                <wls:package-name>org.slf4j.*</wls:package-name>
            </wls:prefer-application-packages>
        </wls:container-descriptor>
    </wls:weblogic-web-app>
* dle战
* 部署到Weblogic12C
* 它现在应该可以工作了:)非常感谢Dave Syer和Evgeni!

注意:这里有一个类似的问题: 在Weblogic中部署Spring
Boot应用程序
…但是另一个问题与部署有关,这有点模糊(部署本身对我来说很好)


阅读 569

收藏
2020-05-30

共1个答案

小编典典

Weblogic的问题在于,它查找 直接
实现WebApplicationInitializer以加载上下文的类。您可能会扩展SpringBootServletInitializer。尝试创建一个实现WebApplicationInitializer并复制其中内容的SpringBootServletInitializer类(据我所记得,您还需要从spring源复制一个包级别的类,以便您的自定义类可以看到它)。

2020-05-30