本文介绍了JSF-2.3没有找到我的@Named CDI-1.2托管bean的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

最近从2.2升级到JSF 2.3后,我注意到@ManagedBean已被弃用,经过一些研究发现我应该使用CDI-1.2托管bean和@Named注释。

Having recently upgraded to JSF 2.3 from 2.2, I noticed that @ManagedBean was deprecated, and after some research found that I should be using CDI-1.2 managed beans and the @Named annotation.

但是在转换到@Named之后,JSF页面找不到托管bean:

However after changing over to @Named, the JSF pages can't find the managed bean:

我正在使用Maven,eclipse和WebSphere Application Server自由v16.0.0.4
不知道我做错了什么,这里是相关文件:

I am using Maven, eclipse and WebSphere Application Server liberty v16.0.0.4No Idea what I am doing wrong, here are the relevant files:

Controller.java:

Controller.java:

package ManagedBeans;

import java.io.PrintWriter;
import java.io.Serializable;
import java.io.StringWriter;

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import javax.servlet.http.Part;

import Main.FileHandler;
import Main.IBMEmployee;

@Named("controller")
@SessionScoped
public class Controller implements Serializable {

    private Part telstraCustomersFile;
    private Part terminateesFile;
    private String telstraPass;
    private String termineesPass;
    private String exception;
    private String exceptionTrace;
    private FileHandler fileHandler = new FileHandler();
    private IBMEmployee[] potentialMatches;

    public String perform()
    {
        try {
            fileHandler.process(telstraCustomersFile, terminateesFile, telstraPass, termineesPass);
            potentialMatches = fileHandler.potentialMatches;
        }
        catch (Exception ex) {
            StringWriter errors = new StringWriter();
            ex.printStackTrace(new PrintWriter(errors));
            exception = ex.toString();
            exceptionTrace = errors.toString();

            return ("errorPage.xhtml");
        }

        return ("searchExcel.xhtml");
    }

    public void setTelstraPass(String value) { telstraPass = value; }
    public String getTelstraPass() { return telstraPass; }
    public void setTermineesPass(String value) { termineesPass = value; }
    public String getTermineesPass() { return termineesPass; }
    public void setTelstraCustomersFile(Part file) { telstraCustomersFile = file; }
    public Part getTelstraCustomersFile() { return telstraCustomersFile; }
    public void setTerminateesFile(Part file) { terminateesFile = file; }
    public Part getTerminateesFile() { return terminateesFile; }
    public String getException() { return exception; }
    public String getExceptionTrace() { return exceptionTrace; }
    public IBMEmployee[] getExactMatches() { return fileHandler.exactMatches; }
    public IBMEmployee[] getPotentialMatches() { return potentialMatches; }
}

index.xhtml:

index.xhtml:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
      <h:head>
        <title>Termination Checklist</title>
        <h:outputScript name="js/scripts.js"/>
        <h:outputStylesheet name="css/PageFormat.css"/>

        Created By Jerry Boyaji
        <h:graphicImage id="IBMLogo" name="images/IBM-logo.jpg"  width="101" height="48"/>
    </h:head>
    <h:body onload="enableDisableSubmitBtn()">
        <div id="ContentFrame">
            <h1>Corporate Account Termination Application (CATA)</h1>
            <h3>Excel Search: <br/> Select your spreadsheet files to upload:</h3>
            <br/>
            <br/>
            <h:form id="excelInputForm" enctype="multipart/form-data"
                name="UploadForm"
                method="Post">

                Telstra Spreadsheet File:

                <br/>
                <h:inputFile
                    id="telstraCustomers"
                    name="telstra file"
                    size="40"
                    value="#{controller.telstraCustomersFile}"
                    required="True"
                    onchange="enableDisableSubmitBtn()"/>

                Password if Applicable:
                <h:inputSecret
                    id="telstraSpreadsheetPassword"
                    value="#{controller.telstraPass}"
                    label="Password if Applicable"/>

                <br/>
                <br/>

                Termination Spreadsheet File:
                <br/>
                <h:inputFile
                    id="terminatees"
                    name="termination file"
                    size="40"
                    value="#{controller.terminateesFile}"
                    required="True"
                    onchange="enableDisableSubmitBtn()" />

                Password if Applicable:
                <h:inputSecret
                    id="termineesSpreadsheetPassword"
                    value="#{controller.termineesPass}"
                    label="Password if Applicable"/>

                <br/>
                <br/>

                <h:commandButton
                    id="submit"
                    value="Upload and Continue"
                    type = "submit"
                    action="#{controller.perform}"/>

            </h:form>
        </div>
    </h:body>
</html>

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_3_0.xsd" version="3.0">
    <display-name>MainApplication</display-name>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>
    <context-param>
        <description>
        State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>
    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
        <param-value>resources.application</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>*.xhtml</url-pattern>
    </servlet-mapping>

    <security-constraint>
        <display-name>HTTPS Redirect Security Constraint</display-name>
        <web-resource-collection>
            <web-resource-name>MainApplication</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
</web-app>

Server.xml:

Server.xml:

<server description="jerry's local server">

    <!-- Enable features -->
    <featureManager>
        <feature>localConnector-1.0</feature>
        <feature>websocket-1.1</feature>
        <feature>appSecurity-2.0</feature>
        <feature>cdi-1.2<feature>
        <feature>jsp-2.3</feature>
    </featureManager>

    <basicRegistry id="basic">
      <user name="admin" password="****"/>
   </basicRegistry>

   <administrator-role>
      <user>admin</user>
   </administrator-role>

    <remoteFileAccess>
        <writeDir>${server.config.dir}</writeDir>
    </remoteFileAccess>

    <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
    <httpEndpoint host="localhost" httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/>

    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true"/>

    <applicationMonitor updateTrigger="mbean"/>
    <keyStore id="defaultKeyStore" password="****"/>

    <webApplication id="MainApplication" location="MainApplication.war" name="MainApplication"/>
</server>

pom.xml:

<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>Termination-Checklist-Maven</groupId>
  <artifactId>MainApplication</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>MainApplication</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <pluginRepositories>
        <!-- Configure WASdev repository -->
        <pluginRepository>
            <id>WASdev</id>
            <name>WASdev Repository</name>
            <url>http://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/maven/repository/</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </pluginRepository>
    </pluginRepositories>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
          <webXml>WebContent/WEB-INF/web.xml</webXml>
        </configuration>
      </plugin>
      <plugin>
            <groupId>com.ibm.websphere.wlp.maven.plugins</groupId>
            <artifactId>liberty-maven-plugin</artifactId>
            <version>1.0</version>
            <configuration>
                <serverHome>/Applications/WebProfile</serverHome>
            </configuration>
      </plugin>
    </plugins>
  </build>

  <repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
  </repositories>


  <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.faces</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>1.2</version>
        <scope>provided<scope>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.16-beta2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.16-beta2</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.json</artifactId>
        <version>1.0.4</version>
    </dependency>
    <dependency>
        <groupId>javax.json</groupId>
        <artifactId>javax.json-api</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>3.16-beta2</version>
    </dependency>
        <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>
  </dependencies>
</project>

faces-config.xml:

faces-config.xml:

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.3"
    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-facesconfig_2_3.xsd">
</faces-config>

我的WEB-INF文件夹中还有一个空的beans.xml文件,带有我的web.xml和faces-config.xml。

I also have an empty beans.xml file in my WEB-INF folder with my web.xml and faces-config.xml.

据我所知,我做的一切都很正确,我没有JSF或CDI的竞争实现,也没有使用任何JSF包中的范围。我完全不知道为什么这不起作用...

As far as I can see I have done everything right, I have no competing implementations of JSF or CDI, and am not using any of the scopes from the JSF packages. I have absolutely no idea why this is not working...

推荐答案

正如Gas指出的那样,问题在于内置的CDI WAS中的功能不适用于外部JSF库。

As Gas pointed out, the issue was that the inbuilt CDI feature in WAS does not work with an external JSF library.

请参阅确认了这一点。

See my post on IBM support page which confirms this.

使用JSF-2.2继续使用Web套接字的一种方法是使用Javax.websocket包作为@Gas指出。但是,这个Web套接字实现的局限性在于,将SessionScoped ManagedBean中包含的数据发送到该会话的客户端是非常容易的,因为它本来应该使用来自JSF-2.3的f:websocket,因为我希望做。

A way to still make use of web sockets using JSF-2.2 is to use the Javax.websocket package as @Gas pointed out. However the limitation of this web socket implementation is that it is nowhere near as easy to send data contained in a SessionScoped ManagedBean to the client of that session only as it would have been using f:websocket from JSF-2.3 as I would have liked to do.

这篇关于JSF-2.3没有找到我的@Named CDI-1.2托管bean的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-12 23:32