2

我设法用 Primefaces 运行 WAB 包。问题是某些示例正在运行,而某些示例在我尝试实现它们时出现问题。我测试了这个例子:

    <?xml version='1.0' encoding='UTF-8' ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"    
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:p="http://primefaces.org/ui"  >
        <h:head>
            <ui:insert name="header">           
                <ui:include src="header.xhtml"/>         
            </ui:insert>
        </h:head>
        <h:body>

            <h1><img src="resources/css/images/icon.png" alt="NVIDIA.com" /> History Center</h1>
            <!-- layer for black background of the buttons -->
            <div id="toolbar" style="margin: 0 auto; width:1180px; height:30px; position:relative;  background-color:black">
                <!-- Include page Navigation -->
                <ui:insert name="Navigation">           
                    <ui:include src="Navigation.xhtml"/>         
                </ui:insert>

            </div>  

            <div id="logodiv" style="position:relative; top:35px; left:0px;"> 
                <h:graphicImage alt="Demo edit form"  style="position:relative; top:-20px; left:9px;"  value="resources/images/logo_linuxz.png" />
            </div>
            <div id="main" style="margin: 0 auto; width:1190px; height:700px; position:absolute;  background-color:transparent; top:105px">

                <div id="mainpage" style="margin: 0 auto; width:1190px; height:500px; position:absolute;  background-color:transparent; top:80px">

                    <div id="settingsHashMap" style="width:350px; height:400px; position:absolute;  background-color:r; top:20px; left:1px">

                        <h:form>

                            <p:growl id="growl" showDetail="true" sticky="true" />

                            <p:panel header="Growl">
                                <h:panelGrid columns="2">
                                    <h:outputText value="Your Name: *" /> 
                                    <p:inputText value="#{LinuxController.text}" required="true" label="Name"/>
                                </h:panelGrid>

                                <p:commandButton value="Save" actionListener="#{LinuxController.save}" update="growl"/>
                            </p:panel>

                        </h:form>


                    </div>   

                </div>  
            </div>

        </h:body>
    </html>

import javax.faces.bean.ViewScoped;

import java.io.Serializable;

import javax.faces.application.FacesMessage;  
import javax.faces.context.FacesContext;  

// Update form example
@Named("LinuxController")
@ViewScoped
public class Linux implements Serializable {

    public Linux() {  
    }  

    private String text;

    public String gettext() {
        return text;
    }
    public void settext(String text) {
        this.text = text;
    }

    public void save(ActionEvent actionEvent) {
        FacesContext context = FacesContext.getCurrentInstance();

        context.addMessage(null, new FacesMessage("Successful", "Hello " + text));
        context.addMessage(null, new FacesMessage("Second Message", "Additional Info Here..."));
    }

}

这是 POM 文件:

<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>com.DX_57</groupId>
    <artifactId>History-Module-57</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>History-Module-57</name>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>


        <dependency>  
            <groupId>org.primefaces</groupId>  
            <artifactId>primefaces</artifactId>  
            <version>3.3</version>  
            <type>jar</type>

        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.3.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>4.2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>osgi-cdi-api</artifactId>
            <version>3.1-b41</version>
            <type>jar</type>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.faces</artifactId>
            <version>2.1.9</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>

        </dependency>
    </dependencies>

    <build>
        <pluginManagement>

            <plugins>
                <plugin>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>maven-bundle-plugin</artifactId>
                    <version>2.3.7</version>
                    <extensions>true</extensions>
                    <configuration>
                        <supportedProjectTypes>
                            <supportedProjectType>ejb</supportedProjectType>
                            <supportedProjectType>war</supportedProjectType>
                            <supportedProjectType>bundle</supportedProjectType>
                            <supportedProjectType>jar</supportedProjectType>
                        </supportedProjectTypes>
                        <instructions>
                            <!-- Read all OSGi configuration info from this optional file -->
                            <_include>-osgi.properties</_include>
                            <!-- By default, we don't export anything -->
                            <Export-Package></Export-Package>
                            <DynamicImport-Package>*</DynamicImport-Package>
                            <Import-Package>*;resolution:=optional</Import-Package>
                            <Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
                            <Embed-Transitive>true</Embed-Transitive>
                            <Embed-Directory>WEB-INF/lib/</Embed-Directory>
                            <Embed-StripVersion>false</Embed-StripVersion>
                            <Embed-StripGroup>true</Embed-StripGroup>
                            <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
                        </instructions>
                    </configuration>
                    <executions>
                        <execution>
                            <id>bundle-manifest</id>
                            <phase>process-classes</phase>
                            <goals>
                                <goal>manifest</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>bundle-install</id>
                            <phase>install</phase>
                            <goals>
                                <goal>install</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin> 

                <plugin> <!-- Need to use this plugin to build war files -->
                    <artifactId>maven-war-plugin</artifactId>
                    <groupId>org.apache.maven.plugins</groupId>
                    <!-- Use version 2.1-beta-1, as it supports the new property failOnMissingWebXml -->
                    <version>2.2</version>
                    <configuration>
                        <archive>
                            <!-- add bundle plugin generated manifest to the war -->
                            <manifestFile>
                                ${project.build.outputDirectory}/META-INF/MANIFEST.MF
                            </manifestFile>
                            <!-- For some reason, adding Bundle-ClassPath in maven-bundle-plugin
                            confuses that plugin and it generates wrong Import-Package, etc.
                            So, we generate it here.
                            -->
                            <manifestEntries>
                                <Bundle-ClassPath>WEB-INF/classes/
                                </Bundle-ClassPath>
                            </manifestEntries>
                        </archive>
                    <!-- We don't have a web.xml -->
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>6.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <!-- Enable this plugin for all modules -->
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>glassfish-repo</id>
            <name>The Glassfish repository</name>
            <url>http://download.java.net/maven/glassfish/</url>
        </repository>
        <repository>  
            <id>prime-repo</id>  
            <name>PrimeFaces Maven Repository</name>  
            <url>http://repository.primefaces.org</url>  
            <layout>default</layout>  
        </repository>  
    </repositories>
    <description>Module History Module</description>
</project>

我只收到错误消息。我在 Glassfish 中得到了这个错误堆栈:

[#|2012-06-07T15:45:52.438+0300|SEVERE|glassfish3.1.2|javax.faces.event|_ThreadID=339;_ThreadName=Thread-2;|Received 'javax.el.MethodNotFoundException' when invoking action listener '#{LinuxController.save}' for component 'j_idt17'|#]

[#|2012-06-07T15:45:52.439+0300|SEVERE|glassfish3.1.2|javax.faces.event|_ThreadID=339;_ThreadName=Thread-2;|javax.el.MethodNotFoundException: Method not found: com.DX_57.HM_57.Linux@2be5284e.save()
    at com.sun.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:160)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:251)
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:722)
|#]

[#|2012-06-07T15:45:52.439+0300|SEVERE|glassfish3.1.2|javax.enterprise.resource.webcontainer.jsf.context|_ThreadID=339;_ThreadName=Thread-2;|JSF1073: javax.faces.event.AbortProcessingException caught during processing of INVOKE_APPLICATION 5 : UIComponent-ClientId=j_idt12:j_idt17, Message=Method not found: com.DX_57.HM_57.Linux@2be5284e.save()|#]

[#|2012-06-07T15:45:52.440+0300|SEVERE|glassfish3.1.2|javax.enterprise.resource.webcontainer.jsf.context|_ThreadID=339;_ThreadName=Thread-2;|Method not found: com.DX_57.HM_57.Linux@2be5284e.save()
javax.faces.event.AbortProcessingException: Method not found: com.DX_57.HM_57.Linux@2be5284e.save()
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:182)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:722)
Caused by: javax.el.MethodNotFoundException: Method not found: com.DX_57.HM_57.Linux@2be5284e.save()
    at com.sun.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:160)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:251)
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
    ... 33 more
|#]

什么可能导致这个问题?

更新

我更改了托管 bean 的名称。事实证明,框架正在搜索托管 bean- 的错误名称avax.el.MethodNotFoundException: Method not found: com.DX_57.HM_57.Linux@c280dca.save()。应该avax.el.MethodNotFoundException: Method not found: com.DX_57.HM_57.Linux@LinuxController.save()是这个配置问题吗?

4

1 回答 1

6

这是因为 CDI 本身不支持 ViewScoped。要么更改@Named("LinuxController")@ManagedBean(name="LinuxController")使其成为纯 JSF,要么将 ViewScoped 更改为诸如 Seam 的 ConversationalScope 或 SessionScope 之类的其他东西(或者在您的情况下,我认为 RequestScope 就可以了)

PS还要检查你是否为ActionEvent实现了正确的包,曾经我花了两个小时才发现我有java.awt.event.ActionEvent而不是JSF的正确包:-)

编辑

那么您到底尝试了什么?您是否更改了 bean 的范围,将其设为 ManagedBean 而不是 CDI bean,更改了页面和 bean 中的方法名称?或者您可以创建另一个具有相同签名的 bean 并尝试重现错误. 还尝试为 text 变量分配一些值,以查看 getText 方法是否有效。在您尝试缩小可能的选项之前,很难说问题出在哪里。

解决方案

好的,所以我希望我为您找到了解决方案。您应该决定是要使用 CDI 还是纯 JSF。如果您想使用 CDI 方式,请将 bean 注释为@Named并使用其他范围 then ViewScoped。如果你选择 JSF 方式,那么改成@Named@ManagedBean可以了ViewScoped。在这两种情况下,您都应该删除 managed-bean 记录faces-config.xml,它是JSF 1.2在 annotation 之前使用 with 的@ManagedBean,因此现在已弃用(并且您不能在 config 中同时使用 annotation 和 record,您必须选择其中一个选项)。

您还需要改进进口。正如我之前写的,你已经导入了java.awt.ActionEvent但你需要javax.faces.event.ActionEvent. 另请注意,如果您使用 CDI,则从javax.enterprise.context.*包中导入范围的所有注释(RequestScoped、SessionScoped、...)(请参阅那里缺少 ViewScope),如果要使用 JSF,ManagedBean则从javax.faces.bean.*. 您不能将它们混合在一起,因为那样会出现一些奇怪的错误,例如您所拥有的错误。

是更改后的文件。

您还应该遵循 Java 惯例并使用CamelCase命名您的方法(即不是gettext()而是getText())。这对于 JSF 表达式语言尤其重要,因为您需要 setter 和 getter 来访问页面上的 bean 属性,并且这些方法应该用 CamelCase 编写,以便 JSF EL 可以解析它们。

于 2012-06-07T13:02:40.117 回答