Весенняя загрузка, Tomcat не может распознать компонент JSF

Я пытаюсь запустить приложение Spring Boot + JSF с mvn spring-boot:run, в то время как мой проект отлично работает при развертывании на Payara, на Spring Boot Tomcat похоже, что он не может распознать bean-компоненты JSF.

Код ошибки

Sun Dec 16 22:33:33 CET 2018
There was an unexpected error (type=Internal Server Error, status=500).
/hello.xhtml @14,48 value = "#{helloBean.name}": Target Unreachable, identifier [helloBean] resolved to null  

Я знаю, что в моем примере я использую JSF 2.2, но сначала я пробовал разные версии кода и pom, но мне не удалось заставить его работать, через несколько часов я развернул его на payara, и он работал, так что теперь я пытаясь понять, что не так с моим примером, я не могу запустить его с Tomcat при загрузке Spring, поэтому я использовал такой простой пример ниже.

Вот мой код

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 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>adsad</groupId>
<artifactId>adasdsad</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath />
</parent>

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

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>2.2.17</version>
    </dependency>

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.17</version>
    </dependency>

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

</dependencies>

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



</project>  

Application.java

package hello;

import com.sun.faces.config.ConfigureListener;
import org.h2.server.web.WebServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.ServletContextAware;

import javax.faces.webapp.FacesServlet;
import javax.servlet.ServletContext;

@SpringBootApplication
public class Application implements ServletContextAware {

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

@Bean
public ServletRegistrationBean facesServletRegistration() {
    ServletRegistrationBean registration = new ServletRegistrationBean(
            new FacesServlet(), "*.xhtml");
    registration.setLoadOnStartup(1);
    return registration;
}

@Override
public void setServletContext(ServletContext servletContext) {
    servletContext.setInitParameter("com.sun.faces.forceLoadConfiguration", Boolean.TRUE.toString());
}

@Bean
public ServletListenerRegistrationBean<ConfigureListener> jsfConfigureListener() {
    return new ServletListenerRegistrationBean<ConfigureListener>(
            new ConfigureListener());
}


}

HelloBean.java

package hello;


import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.io.Serializable;

@ManagedBean
@SessionScoped
public class HelloBean implements Serializable {

private static final long serialVersionUID = 1L;

private String name;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
}  

hello.xhtml

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml"
  xmlns:f = "http://java.sun.com/jsf/core"
  xmlns:h = "http://java.sun.com/jsf/html">

<h:head>
    <title>JSF 2.0 Hello World</title>
</h:head>
<h:body>
    <h2>JSF 2.0 Hello World Example - hello.xhtml</h2>
    <h:form>
    <h:inputText value = "#{helloBean.name}"></h:inputText>
    <h:commandButton value = "Welcome Me" action = "welcome"></h:commandButton>
</h:form>
</h:body>
</html>  

welcome.xhtml

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml"
  xmlns:h = "http://java.sun.com/jsf/html">

<h:head>
    <title>JSF 2.0 Hello World</title>
</h:head>
<h:body bgcolor = "white">
    <h2>JSF 2.0 Hello World Example - welcome.xhtml</h2>
    <h2>Welcome #{helloBean.name}</h2>
</h:body>
</html>

вам нужен web.xml или faces-config.xml, если вы используете jsf 2.2: вы можете проверить аналогичную конфигурацию: dzone.com/articles/developing-jsf-applications-with-spring-b‌ oot или за пределамиjava.net/jsf-2-2-primefaces-5-spring-boot

TinyOS 17.12.2018 02:10

Спасибо, но мой код работает на Payara, beans распознается, похоже, что моя конфигурация как-то не подходит для tomcat. Если я правильно понимаю, то faces-config.xml и web.xml не требуются в> JSF 2.0.

x0x0 18.12.2018 20:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
2
2
338
0

Другие вопросы по теме