Jsf JBoss7.1Weld在耳朵的罐子中找到托管Bean,但战争没有
jboss-as-7.1.1,动态web模块3.0,JSF2.0(Mojarra),EclipseIndigoSR2 我有一个EAR,Ynale.EAR,它包含一个YnaleImpl.jar和一个Ynale.war:Jsf JBoss7.1Weld在耳朵的罐子中找到托管Bean,但战争没有,jsf,jboss7.x,managed-bean,jboss-weld,Jsf,Jboss7.x,Managed Bean,Jboss Weld,jboss-as-7.1.1,动态web模块3.0,JSF2.0(Mojarra),EclipseIndigoSR2 我有一个EAR,Ynale.EAR,它包含一个YnaleImpl.jar和一个Ynale.war: Ynale.ear |-YnaleWeb.war | |-META-INF | | |-MANIFEST.MF: | | Manifest-Version: 1.0 | | Class-Path: deploy
Ynale.ear
|-YnaleWeb.war
| |-META-INF
| | |-MANIFEST.MF:
| | Manifest-Version: 1.0
| | Class-Path: deployment.Ynale.ear.YnaleImpl
| |
| |-WEB-INF
| | |-beans.xml
| | | (empty)
| | |
| | |-faces-config.xml:
| | | <?xml version="1.0" encoding="UTF-8"?>
| | | <faces-config version="2.0"
| | | xmlns="http://java.sun.com/xml/ns/javaee"
| | | xmlns:xi="http://www.w3.org/2001/XInclude"
| | | 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-facesconfig_2_0.xsd">
| | | </faces-config>
| | |
| | |-web.xml:
| | <?xml version="1.0" encoding="UTF-8"?>
| | <web-app version="3.0"
| | 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_3_0.xsd">
| | <display-name>YnaleWeb</display-name>
| | <context-param>
| | <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
| | <param-value>server</param-value>
| | </context-param>
| | <context-param>
| | <param-name>primefaces.THEME</param-name>
| | <param-value>redmond</param-value>
| | </context-param>
| | <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>*.jsf</url-pattern>
| | </servlet-mapping>
| | <servlet-mapping>
| | <servlet-name>Faces Servlet</servlet-name>
| | <url-pattern>*.xhtml</url-pattern>
| | </servlet-mapping>
| | <session-config>
| | <session-timeout>300</session-timeout>
| | <cookie-config>
| | <name>JSESSIONID</name>
| | </cookie-config>
| | <tracking-mode>COOKIE</tracking-mode>
| | </session-config>
| | </web-app>
| |
| |-Login.xhtml
| <!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"
| xmlns:f="http://java.sun.com/jsf/core"
| xmlns:ui="http://java.sun.com/jsf/facelets">
| <h:head>
| <title>YNALE Log in page</title>
| </h:head>
| <f:view>
| <body>
| <div>#{textValue.value()}</div>
| </body>
| </f:view>
| </html>
|
|-lib
|-META_INF
| jboss-deployment-structure.xml:
| <jboss-deployment-structure>
| <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
| <deployment>
| <dependecies>
| <module name="deployment.Ynale.ear.YnaleImpl" export="true"/>
| </dependencies>
| </deployment>
| <module name="deployment.Ynale.ear.YnaleImpl" >
| <resources>
| <resource-root path="lib/YnaleImpl.jar" />
| </resources>
| </module>
| </jboss-deployment-structure>
|
|-YnaleImpl.jar:
|-META-INF
| beans.xml:
| (empty)
| MANIFEST.MF:
| Manifest-Version: 1.0
|
|-org
|-ynale
|-utils
|-TextValue.class
package org.ynale.utils;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class TextValue {
public TextValue() {}
public String value() {
return "TextValue";
}
}
在Web.war中,我有login.xhtml,它有:
#{textValue.value()}
我在日志中没有收到任何错误(输出到FIN/DEBUG),但从未调用textValue.value()。我的页面上没有输出
有什么想法吗
编辑:WAR本身内部定义的托管bean工作正常
编辑2:对不起,我确实有一个,但忘了在帖子中包括:
<?xml version="1.0"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
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-facesconfig_2_0.xsd"/>
Weld是一个CDI实现,它不扫描JSF2特定的注释,它只扫描CDI特定的注释,如
@Named
。这里有一个JSF2特定的@ManagedBean
注释。为此,您需要在JAR中有一个与JSF2兼容的/META-INF/faces config.xml
,以便让JSF2 web应用程序扫描JAR文件中带有JSF2特定注释的类,JAR文件位于/web-INF/lib
中
另见:
/WEB-INF/lib
。JSF不会扫描其他地方的JAR。然而,CDI确实如此。如果将@ManagedBean
替换为@Named
(并从javax.enterprise.context
导入@RequestScoped
),那么它应该可以工作。但是EAR的/lib
中的JAR通常不包含特定于web/前端的工件,因此这首先是完全错误的。EAR的/lib
中的JAR通常包含共享业务(EJB/JPA/Entity)代码。代码在一个单独的JAR中的原因是,我将使用YnaleWeb.WAR访问internet,使用YnaleWS.WAR(web服务)访问intranet。我想分享所有的商业逻辑。一个特定的服务器实例可能运行一个或两个WAR。您知道更好的方法吗?业务逻辑属于EJB,而不是JSF管理的bean。让它成为无状态的(或者可能是有状态的),然后通过@EJB
将它注入到WAR中的普通JSF托管bean中(当然也可以是/WEB-INF/lib
中的JAR)。
<?xml version="1.0"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
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-facesconfig_2_0.xsd"/>