在Weblogic 12C上访问Spring Boot示例应用程序的新部署时出现问题

时间:2014-08-29 15:51:55

标签: java spring spring-boot weblogic12c

我在将其部署到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目录,这样你就不必经历"入门&#34 ;上面的页面(在&#34中为您完成的所有更改;完成")。
  • 打开文件gs-spring-boot / complete / build.gradle并添加"申请插件:' war' "低于另一个"应用插件"条目

此时,您可以通过运行gradle" bootRun"来验证一切顺利。在嵌入式Tomcat服务器中启动应用程序的任务。一旦tomcat启动,浏览到localhost:8080 /并看到你得到#34;来自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" dir
    • 选择complete.war旁边的单选按钮,然后点击下一步
    • 选择"安装为应用程序"并点击下一步
    • 保留所有选项[仅限DD,使用默认值,使用相同的辅助功能]并点击下一步
    • 点击完成

此时,您将看到应用程序部署正常: - 点击"部署"再次看到你的完成" springBoot应用程序已列出并处于ACTIVE状态 - 点击"完成"并在此页面上注意:" Context Root:/ complete"。注意:weblogic文档说如果weblogic.xml中没有定义上下文根,那么它使用war文件的名称(减去.war)

现在,问题是:获得403:

如果您尝试在localhost:7001 /完成访问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)

  • 转到&#34;网络应用程序&#34;并选择&#34旁边的复选框;完成&#34;然后点击&#34;删除&#34;
  • 重新启动你的weblogic12C服务器(只是为了偏执)
  • 运行&#34; gradle clean&#34;然后&#34; gradle war&#34;任务再次生成一个新的战争文件
  • 打开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 / you&#39; lle get 403

如果您使用&#34; gradle bootrun&#34;尝试使用tomcat,您可以很好地使用:localhost:8080 / pierre.htm(你得到#34;来自SpringBoot的问候!&#34;)

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

  • Weblogic确实了解/ testApp
  • Weblogic不知道/testApp/pierre.htm是什么。它从未配置为RequestMapping。
  • 有一些&#34;弹簧布线&#34;因为它无法在weblogic上工作....

这就是我被困的地方......任何人都可以想到JavaConfig&#34;接线&#34;我错过了让它在Weblogic上运行?任何帮助非常感谢。谢谢!

解决方案

如果有人来到这里,为了使其简单而不是阅读下面的所有评论,请按照以下方式进行操作:

  • 从SpringBoot示例应用开始,然后选择&#34;完成&#34;来自这里的解决方案: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>
    
    • gradle war
    • 部署到Weblogic12C
    • 它现在应该工作了:)非常感谢Dave Syer和Evgeni!

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

  • 从SpringBoot示例应用开始,然后选择&#34;完成&#34;来自这里的解决方案:spring.io/guides/gs/convert-jar-to-war /

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

      受保护的SpringApplicationBuilder configure(SpringApplicationBuilder应用程序){     退货申请; }

对此:

    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
      return application.sources(Application.class);
    }
  • 将类org.springframework.boot.context.web.ErrorPageFilter复制到包&#34; hello&#34;在示例应用
  • 创建一个新文件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>
    
    • gradle war
    • 部署到Weblogic12C
    • 它现在应该工作了:)非常感谢Dave Syer和Evgeni!

注意:这里有类似的问题: Deploy Spring Boot app in Weblogic ...但是另一个问题是关于部署而且它有点模糊(部署本身对我来说很好)

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

您可以继续扩展它,而只需添加一个冗余的&#34;实现WebApplicationInitializer&#34;而不是获取SpringBootServletInitializer和ErrorPageFilter的副本。到你的班级:

@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);
    }

}

答案 2 :(得分:-1)

类型为Application的Redundant superinterface WebApplicationInitializer,已由SpringBootServletInitializer定义