在Weblogic12C上访问SpringBoot示例应用程序的新部署时出现问题

我将它部署到Weblogic12C后访问示例springBoot应用程序时遇到问题。 使用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目录,这样你就不必浏览上面的“入门”页面了(所有更改都在“完成”中完成) “)。
  • 打开文件gs-spring-boot / complete / build.gradle并在其他“apply plugin”条目下添加“apply plugin:’war’”

此时,您可以通过运行gradle“bootRun”任务来validation一切正常,这些任务在嵌入式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(TM)SE运行时环境(版本1.7.0_45-b18)Java HotSpot(TM)服务器VM(版本24.45-b08,混合模式)

    • 在控制台中,部署war文件:
    • 点击“部署”
    • 点击“安装”
    • 浏览你“gs-spring-boot \ complete \ build \ libs”目录
    • 选择complete.war旁边的单选按钮,然后点击下一步
    • 选择“安装为应用程序”并点击下一步
    • 保留所有选项[仅限DD,使用默认值,使用相同的辅助function]并点击下一步
    • 点击完成

此时,您将看到应用程序部署正常: – 再次单击“部署”并查看您的“完整”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以包含:

       12.1.1 testApp  
  • 现在回到你的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):

  • localhost:7001 / testApp / pierre.htm你会得到404
  • localhost:7001 / testApp /你将获得403

如果你尝试使用“gradle bootrun”运行tomcat,你可以很好地使用它:localhost:8080 / pierre.htm(你得到“来自SpringBoot的问候!”)。

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

  • Weblogic确实了解/ testApp
  • Weblogic不知道/testApp/pierre.htm是什么。 它就像从未配置为RequestMapping。
  • 有一些“spring布线”缺少它在weblogic上工作….

这就是我被困住的地方……任何人都可以想到JavaConfig的“布线”是什么让我无法在Weblogic上运行? 任何帮助非常感谢。 谢谢!!

如果有人来这里,为了使它比阅读下面的所有评论更简单,这里是如何让它工作:

  • 从SpringBoot示例应用程序开始,然后从这里获取“完整”解决方案: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并将此内容放入其中:

       12.1.1 helloApp   org.slf4j.*    
    • gradle war
    • 部署到Weblogic12C
    • 它现在应该工作:)非常感谢Dave Syer和Evgeni!

以前的解决方案(保留给后人)

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

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

      protected SpringApplicationBuilder configure(SpringApplicationBuilder应用程序){返回应用程序; }

对此:

  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } 
  • 将类org.springframework.boot.context.web.ErrorPageFilter复制到示例应用程序中的“hello”包中
  • 创建一个新文件src / main / webapp / WEB-INF / weblogic.xml并将此内容放入其中:

       12.1.1 helloApp   org.slf4j.*    
    • gradle war
    • 部署到Weblogic12C
    • 它现在应该工作:)非常感谢Dave Syer和Evgeni!

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

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

Evgeni的解决方案非常有效。 但我有所改善。

您可以继续扩展它,而不是获取SpringBootServletInitializer和ErrorPageFilter的副本,而只需向您的类添加冗余的“implements WebApplicationInitializer”:

 @Configuration @EnableJpaRepositories @EnableAutoConfiguration @ComponentScan("nz.co.myapp") public class Application extends SpringBootServletInitializer implements WebApplicationInitializer { /** Used for running in war */ @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } } 

类型为Application的冗余超接口WebApplicationInitializer,已由SpringBootServletInitializer定义