Как запустить контент stati c для использования (SpringBoot 2.x + weblogi c + * .war) из пути к классам приложения? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть сервер weblogi c, на котором я работаю с Inlellij Idea для аудита работы приложения. Я сделал веб-приложение на основе SpringBoot 2.x. Я использую Intellij Idea 2019 и там я настраиваю развертывание моего веб-приложения на weblogi c 12.x.

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 / weblogi c. 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

Когда я запускаю weblogi c от Intellij Idea, я получаю индекс. html по URL - http://localhost: 7001 / api

Итак, это работает.

Но мне нужен более сложный контент stati c, и я хочу разместить это в classpath приложения.

Я сделал так ...

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

А затем…

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 - Внутренняя ошибка сервера java .lang.NullPointerException at weblogi c. servlet.internal.ServletResponseImpl.sendContentError (ServletResponseImpl. java: 738) в weblogi c .servlet.internal.ServletResponseImpl.sendError (ServletResponseImpl. javaservle. *. 10). sendError (ServletResponseImpl. java: 713) в org.springframework.boot.web.servlet.support.ErrorPageFilter $ ErrorWrapperResponse.sendErrorIfNeeded (ErrorPageFilter. java: 349. ErrorPageFilter $ ErrorWrapperResponse.getWriter (ErrorPageFilter. java: 363) по адресу org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration $ StaticView.render (ErrorMvcAutoConfig.weg. servlet.DispatcherServlet.render (DispatcherServlet. java: 1373) в org.springframework.web.servlet.DispatcherServlet.processDispatchResult (DispatcherServlet. java: 1118) в org.springframework.web. java: 1057) в org.springframework.web.serv let.DispatcherServlet.doService (DispatcherServlet. java: 943) по адресу org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet. java: 1006)

, у которого есть идеи, как исправить это?

1 Ответ

0 голосов
/ 14 февраля 2020

Вы должны использовать «движок шаблонов» - Thymeleaf . По-другому это не работает (хотелось бы использовать чистый (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>

Структура данных c ресурсов

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

src / main / resources / templates / index. html

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

  • *. Properties

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 / weblogi c. 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>

Здесь необходимо соблюдать осторожность при выборе имени для контекста приложения 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);
        }

    }

  • @ SpringBootConfiguration

  • @ EnableAutoConfiguration

  • @ ComponentScan

  • Вы должны иметь эти 3 аннотации, иначе ничего не будет работать.

    В документации сказано, что @ SpringBootConfiguration заменяет аннотации:

  • @ Configuration,
  • @ EnableAutoConfiguration
  • @ ComponentScan

@ SpringBootConfiguration - указывает, что этот класс предоставляет приложение SpringBoot

Он также может использоваться в качестве альтернативы к аннотации @ Configuration , поскольку конфигурацию можно найти автоматически.

@ EnableAutoConfiguration - включает автоматическую c настройку Spring ApplicationContext путем сканирования компонентов пути к классам и регистрация бобов, которые соответствуют различным условиям.

То есть, эта аннотация пытается угадать и настроить bean-компоненты, которые могут вам понадобиться.

Автоматическая настройка классов, обычно применяемая на основе пути к классам вашего приложения и тех компонентов, которые вы определили .

  • При использовании аннотации @ SpringBootConfiguration конфигурация контекста включается автоматически и добавляется аннотация, которая не будет иметь никакого дополнительного эффекта ... Но то, что я вижу здесь все по-другому ... Без этой аннотации ничего не работает ... То есть мы не получаем запрошенные ресурсы.

  • @ ComponentScan - Директива настраивает сканирование компонентов для классов, отмеченных @Configuration. Обеспечивает поддержку параллельно с использованием конфигурации, описанной в формате XML в элементе:

... Но я даже не указал пакеты для сканирования. ...

И без указания этой аннотации я также не могу получить доступ к ресурсам ... ???

Почему это так? Я не знаю…

Что мне нужно для реализации WebApplicationInitializer, - я не знаю…

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

  • Контроллеры

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

  • IndexController

    @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

  • LoginController

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

Создание артефакта (Intellij Idea) - Структура проекта / Артефакты - Alt + Insert - Веб-приложение: Разорвано -> Из модуля Там будет указан путь к каталогу с вашим проектом.

Вы также можете настроить - Структура проекта / Грани

А потом…

Запуск \ Редактирование конфигурации

Здесь вы настраиваете - weblogic…

URL-адрес приложения (в моем случае ) http://localhost: 7001 / rst /

Такой же доступ будет доступен при переносе . * War из среды разработки и развертывании его на внешних веб-журналах c сервер.

Если вы запускаете внешний сервер, вы получаете ошибку

Это означает, что вам нужно запустить maven , и он должен создать * .war-файл…

Также это не работает ...

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

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

}

  • Полагаю, здесь мы можем использовать только xml -конфигурацию для контекста сервлета.

Если кто-то может что-то добавить, уточните, пожалуйста, что не так ....

Может у кого есть какие идеи, по поводу моих проблем, возникших в ходе этого сообщения ....

...