首页 > 解决方案 > 您如何从应用程序的类路径运行静态内容以使用(SpringBoot 2.x + weblogic + *.war)?

问题描述

我有一个 weblogic 服务器,我在 Inlellij Idea 中运行它来审计应用程序的工作。我基于 SpringBoot 2.x 制作了 web-app。我正在使用 Intellij Idea 2019,并在那里配置了在 weblogic 12.x 上部署我的 web 应用程序。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.weblogic</groupId>
    <artifactId>weblogic</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>weblogic</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>

        <version.apache.maven.plugins>3.8.1</version.apache.maven.plugins>
        <version.mapstruct>1.3.0.Final</version.mapstruct>

        <version.apache.common.lang3>3.9</version.apache.common.lang3>
        <version.apache.commons.text>1.8</version.apache.commons.text>
        <version.apache.commons.beanutils>1.9.4</version.apache.commons.beanutils>
        <version.datasource.proxy>1.6</version.datasource.proxy>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>


         <!--исключаем из компиляции встроенный Tomcat-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <archive>
                        <manifest>
                            <addDefaultImplementationEntries>false</addDefaultImplementationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         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_4_0.xsd"
         version="4.0">

</web-app>

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://xmlns.oracle.com/weblogic/weblogic-web-app
                      http://xmlns.oracle.com/weblogic/weblogic-web-app/1.9/weblogic-web-app.xsd">

    <wls:weblogic-version>12.2.1.4.0</wls:weblogic-version>
    <wls:context-root>/api</wls:context-root>
    <wls:container-descriptor>
        <wls:prefer-application-packages>
            <wls:package-name>org.slf4j.*</wls:package-name>
            <wls:package-name>org.springframework.*</wls:package-name>
            <wls:package-name>javax.persistence.*</wls:package-name>
        </wls:prefer-application-packages>
    </wls:container-descriptor>
</wls:weblogic-web-app>

src/main/webapp/index.html

当我通过 Intellij Idea 运行 weblogic 时,我通过 url 获取 index.html - http://localhost:7001/api

所以,它有效。

但我需要更复杂的静态内容,我想将其放入应用程序类路径中。

我是这样做的……</p>

src/main/resources/templates/pages/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello Weblogic!!!</title>
    <link type="text/css" href="/static/css/style.css" rel="stylesheet"/>
</head>
<body>
<div class="st">
    Hello Weblogic!!!
</div>

</body>
</html>

src/main/resources/static/css/style.css

.st{
    color: red;
    font-size: 35px;
}

然后……</p>

src/main/java/com/weblogic/weblogic/mvc/config/MyMvcConfig.java

package com.weblogic.weblogic.mvc.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler(
                "/static/css/**",
                "/templates/pages/**")
                .addResourceLocations(
                        "classpath:/",
                        "classpath:/static/css/",
                        "classpath:/templates/pages/");
    }
}

但我得到...错误 500--weblogic.servlet.internal.ServletResponseImpl.sendContentError(ServletResponseImpl.java:738) 处 weblogic.servlet.internal.ServletResponseImpl.sendError(ServletResponseImpl.java:796) 处的内部服务器错误 java.lang.NullPointerException在 weblogic.servlet.internal.ServletResponseImpl.sendError(ServletResponseImpl.java:713) 在 org.springframework.boot.web.servlet.support.ErrorPageFilter$ErrorWrapperResponse.sendErrorIfNecessary(ErrorPageFilter.java:349) 在 org.springframework.boot.web .servlet.support.ErrorPageFilter$ErrorWrapperResponse.getWriter(ErrorPageFilter.java:363) at org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$StaticView.render(ErrorMvcAutoConfiguration.java:227) at org.springframework.web .servlet.DispatcherServlet。渲染(DispatcherServlet.java:1373)在 org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) 在 org.springframework .web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)1006)1006)

谁有任何想法如何解决这个问题?

标签: htmlspring-bootweblogic12c

解决方案


你必须使用“模板引擎” ——Thymeleaf。它不能以任何其他方式工作(我想使用 pure (html + bootstrap),但不清楚如何配置它)。

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>web.spring.boot.jar</groupId>
    <artifactId>web-spring-boot-jar</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>web-spring-boot-jar</name>
    <packaging>war</packaging>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

静态资源的结构

src/main/resources/static/css/style.css

src/main/resources/templates/index.html

src/main/resources/templates/pages/login/login.html

  • *。特性

src/main/resources/application.properties

  • 这些设置不起作用。
    spring.mvc.servlet.path=/api
    server.servlet.context-path=/api
    server.servlet.contextPath=/api

无法应用这些设置。

  • 配置文件- *.xml

src/main/webapp/WEB-INF/web.xml

   <?xml version="1.0" encoding="UTF-8"?>
   <web-app xmlns="http://java.sun.com/xml/ns/javaee"
            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_4_0.xsd"
            version="4.0">

   </web-app>

如果此文件丢失,则部署会出现错误(在开发环境中,您可以在控制台中看到)。

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
            https://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd
            http://xmlns.oracle.com/weblogic/weblogic-web-app
            https://xmlns.oracle.com/weblogic/weblogic-web-app/1.9/weblogic-web-app.xsd">

        <wls:context-root>rst</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>

        <wls:context-root>rst</wls:context-root>

在这里,您需要小心为应用程序的根上下文选择一个名称(例如,如果您为上下文选择了一个名称 - /web, -> 将会出错,因为该名称是在某处保留的)。

                             Entry point
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan

    public class WebSpringBootJarApplication extends SpringBootServletInitializer implements WebApplicationInitializer {

        public static void main(String[] args) {
            SpringApplication.run(WebSpringBootJarApplication.class, args);
        }

        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(WebSpringBootJarApplication.class);
        }

    }

  • @SpringBoot 配置

  • @EnableAutoConfiguration

  • @ComponentScan

  • 你必须有这 3 个注解,否则什么都行不通。

    文档说@SpringBootConfiguration替换了注释:

  • @配置,
  • @EnableAutoConfiguration
  • @ComponentScan

@SpringBootConfiguration - 表示这个类提供了一个应用 SpringBoot

它也可以用作@Configuration注解的替代品,因为可以自动找到配置。

@EnableAutoConfiguration - 通过扫描类路径组件并注册匹配不同条件的 bean 来启用 Spring ApplicationContext 的自动配置。

也就是说,此注解尝试猜测和配置您可能需要的 bean。

类的自动配置,通常根据您的应用程序的类路径和您定义的那些 bean 应用。

  • 使用@SpringBootConfiguration注解时,自动启用上下文配置并添加注解,不会有任何额外的效果……但是我这里看到的完全不同……没有这个注解,什么都不起作用……也就是说,我们不'没有得到请求的资源。

  • @ComponentScan - 指令为标有@Configuration 的类配置组件扫描。使用元素中 XML 格式描述的配置并行提供支持:

...但我什至没有指定要扫描的包....

而且不指定这个注解,我也无法访问资源......???

这是为什么?我不知道……</p>

我需要什么来实现 WebApplicationInitializer ,-我不知道……</p>

https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-weblogic

  • 控制器

src/main/java/web/spring/boot/jar/webspringbootjar/controller/index/IndexController.java

  • 索引控制器

    @Controller
    public class IndexController {
    
        @RequestMapping(value="/", method= RequestMethod.GET)
        public String index() {
            return "index";
        }
    }
    
    

src/main/java/web/spring/boot/jar/webspringbootjar/controller/login/LoginController.java

  • 登录控制器

    
    @Controller
    public class LoginController {
    
    
        @GetMapping(value = {"/log"})
        public ModelAndView showUsersPage() {
    
            return new ModelAndView("pages/login/login.html");
        }
    
    }
    
    

创建工件(Intellij Idea) - 项目结构/工件 - Alt + 插入 - Web 应用程序:展开 -> 从模块 将指定项目所在目录的路径。

您还可以配置 - 项目结构/方面

然后……</p>

运行\编辑配置

这里你配置——weblogic…</p>

应用程序的 URL(在我的例子中) http://localhost:7001/rst/

当您从开发环境迁移.*war并将其部署到外部 weblogic 服务器时,将可以使用相同的访问权限。

如果启动外部服务器,则会出现错误

这意味着您需要运行maven,并且它必须生成一个 *.war 文件……</p>

而且还不行...

@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses = { ServletContextConfig.class })
public class ServletContextConfig implements WebMvcConfigurer {

    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
    webServerFactoryCustomizer() {
        return factory -> factory.setContextPath("/rootweb");
    }

}

  • 我想我们在这里只能将 xml-configuration 用于 servlet-context。

如果有人可以添加一些东西,请说明什么是错的......

谁能对我在此消息中出现的问题有什么想法....


推荐阅读