我在Spring Boot中使用JSF。 我的问题是,如果我使用@javax.faces.bean.ManagedBean注释我会收到
javax.el.PropertyNotFoundException:目标无法访问,标识符 [numberTest]解析为null
我解决了问题,在托管bean上也放了@Component注释。 另一种方法是将Java类放在WEB-INF中。
我的问题是:上述两种方式对我来说都很糟糕,我认为这会引起麻烦。这个问题的解决方案是什么?
我搜索了很多并尝试了所有解决方案。
(另外一个事实,使用@javax.annotation.ManagedBean核心JSP函数工作(我没有收到错误),但例如EL dos not。)
这是代码,我收到了PropertyNotFoundException:
Configuration.java
import javax.faces.webapp.FacesServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
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.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@SpringBootApplication
@EnableAutoConfiguration
@EnableTransactionManagement
@EnableWebMvc
@Configuration
@EnableJpaRepositories(basePackageClasses = {})
@ComponentScan(basePackageClasses = { CLASSES_ARE_HERE })
public class Configuration {
public static void main(String[] args) {
SpringApplication.run(Configuration.class, args);
}
@Bean
public ServletRegistrationBean servletRegistrationBean() {
FacesServlet servlet = new FacesServlet();
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(servlet, "*.xhtml");
return servletRegistrationBean;
}
}
托管bean:
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
@ManagedBean
@ApplicationScoped
public class NumberTest {
private int theNumber=0;
public NumberTest() {
}
public void addOne() {
theNumber++;
}
public void addN(int n) {
theNumber+=n;
}
public int getTheNumber() {
return theNumber;
}
public void setTheNumber(int theNumber) {
this.theNumber = theNumber;
}
}
的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="3.1">
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<!-- Time in seconds that facelets should be checked for changes since last
request. A value of -1 disables refresh checking. -->
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>1</param-value>
</context-param>
<!-- Set the project stage to "Development", "UnitTest", "SystemTest", or
"Production". -->
<!-- An optional parameter that makes troubleshooting errors much easier. -->
<!-- You should remove this context parameter before deploying to production! -->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
</web-app>
faces-config.xml中
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
</faces-config>
.xhtml
<!DOCTYPE html>
<f:view xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui" encoding="UTF-8">
<html>
<h:head>
</h:head>
<h:body>
<h1>Szám</h1>
<h3>#{numberTest.theNumber}</h3>
<h:form>
<br></br>
<h:commandButton action="#{numberTest.addOne()}" value="Add one"></h:commandButton>
</h:form>
<h:form>
<br></br>
<h:inputText binding="#{input1}" />
<h:commandButton value="Add N" action="#{numberTest.addN(input1.value)}" />
</h:form>
</h:body>
</html>
</f:view>