【问题标题】:Deploy Spring Boot app in Weblogic在 Weblogic 中部署 Spring Boot 应用程序
【发布时间】:2014-09-10 04:26:08
【问题描述】:

我在 webLogic 12C 中部署 Spring Boot 应用程序时遇到问题。

10.4.4 403 禁止 服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。如果请求方法不是 HEAD 并且服务器希望公开请求未完成的原因,它应该在实体中描述拒绝的原因。当服务器不希望确切地显示请求被拒绝的原因或没有其他响应适用时,通常使用此状态代码。

我想知道是否有人可以提供帮助。

【问题讨论】:

  • 这并不是很多信息。它是来自您的应用程序还是来自服务器?如果是应用程序,您是否尝试在另一个容器中部署?可能您需要显示代码。
  • 嗨,戴夫,感谢您的回答,我在 tomcat 中部署了应用程序并且工作正常,但是当我尝试在 WEBLOGIC 中进行部署时,我收到了这条消息,我正在使用本指南 link 但它不起作用。抱歉英语不是我的主要语言。
  • 实在不清楚 403 是从哪里来的。一些 Los 可能会有所帮助,但我真的怀疑没有你的代码我们会取得任何进展。你认为你可以制作一个有这个问题的最小 webapp 并将它发布到 github 上。
  • 戴夫,我做了一个小“Hello World”,这是link,我在 WebLogic 中得到相同的结果 10.4.4 403 Forbidden 并且在 Tomcat 中工作正常。我希望你能帮忙。
  • 谢谢,这很有用。第一个问题:为什么不使用最新的 Boot(截至今天为 1.1.4.RELEASE 或 1.1.5.BUILD-SNAPSHOT)?第二个问题:Weblogic目标容器是否支持servlet 3.0?

标签: java spring spring-boot weblogic12c


【解决方案1】:

我查看了您的代码,发现您的此类代码存在问题: https://github.com/purrox/Spring-example/blob/master/src/main/java/hello/Application.java

您做得正确(如 SpringBoot 文档中所定义),但似乎 Weblogic12C 存在错误(或者可能是对标准的解释)。似乎 Weblogic12C 搜索直接实现 WebApplicationInitializer 的类。注意您的代码如何扩展 SpringBootServletInitializer(它实现了 WebApplicationInitializer)。 Weblogic12C 看起来不喜欢它。因此,最简单的方法是让您的 Application 类实现 WebApplicationInitializer。所以,改变这一行:

public class Application extends SpringBootServletInitializer {  

到这里:

public class Application extends SpringBootServletInitializer implements WebApplicationInitializer {  

注意:修复上述问题后,您将遇到另一个 Weblogic12C 部署问题:“java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath”。要解决其他问题,请创建一个新文件 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>

【讨论】:

  • 我看到在weblogic中部署之前我们需要为war文件指定一个JNDI名称。使用该 JNDI 名称,我们提到了数据源。你能告诉我怎么做吗?我对春天很陌生,春天的靴子。如果问题很愚蠢,请与我联系。
【解决方案2】:

您需要将“implements WebApplicationInitializer”添加到您的 hello.Application。

这是多余的,因为它扩展了 SpringBootServletInitializer,它本身实现了 WebApplicationInitializer,但是,正如@Pierre 指出的那样,weblogic 需要一个类来直接实现它。

【讨论】:

    【解决方案3】:

    如果您打算使用multipart 文件请求,您可能仍然会在部署战争时发现问题。

    问题的根源在于 OrderedCharacterEncodingFilter 在 HiddenHttpMethodFilter 之后运行。 HiddenHttpMethodFilter 在请求上调用 getParameter 时触发请求正文的处理。 OrderedCharacterEncodingFilter 然后运行并设置请求的编码。在处理完请求的主体后设置请求的编码是错误的,并且在 WebLogic 上会导致请求丢失对其所有多部分数据的跟踪。

    解决方法是在 application.properties 中禁用字符编码过滤器:

    spring.http.encoding.enabled: false
    

    【讨论】:

      【解决方案4】:

      我上次遇到了这个问题。应用此帖子中的所有建议后,我仍然收到错误 403。在我的情况下,问题出在 web.xml 文件中。我使用的是 2.5 版而不是 3.0 版,但没有将其配置为通过 DispatcherServlet 加载 ApplicationContext

      来自帖子:What exactly is the web-app version? What does it affect?

      Versioning refers to XML schema version that syntax of your web.xml file must obey. More important, it also indicates the version of Servlet specification that your application implements.
      

      来自 Spring 文档http://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html

      Older Servlet containers don’t have support for the ServletContextInitializer bootstrap process used in Servlet 3.0. You can still use Spring and Spring Boot in these containers but you are going to need to add a web.xml to your application and configure it to load an ApplicationContext via a DispatcherServlet.
      

      最后我将web.xml文件的版本更改为3.0,它开始工作了。

      【讨论】:

        【解决方案5】:

        我在将 SpringBoot 2.3.5.RELEASE 应用程序部署到 Oracle WebLogic Server 12.2.1.4.0 版本时遇到了同样的问题。在我的情况下,只需实现 SpringBootServletInitializer 即可解决它,无需实现 WebApplicationInitializer

        @SpringBootApplication
        @RestController
        public class Application extends SpringBootServletInitializer {
        
        
            public static void main(String[] args) {
                SpringApplication.run(Application.class, args);
            }
        
            @Override
            protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
                return application.sources(Application.class);
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-07
          • 2018-09-13
          • 1970-01-01
          • 2022-12-19
          • 2020-04-26
          相关资源
          最近更新 更多