java - Seam 不注入(inject)有状态的 EJB 依赖

标签 java dependency-injection seam ejb nullpointerexception

我一直没能找到这个问题的解决方案,而且我在 Seam 论坛上发的帖子也没有得到回复。我希望这里有人可以提供帮助。

我是一个使用 Seam 的菜鸟,所以我确信我只是在做一些愚蠢的事情。任何人都可以给我的任何帮助将不胜感激......我浪费了几个小时却一无所获。我使用 jboss 工具在 eclipse 中生成了一个 seam 项目。该工具采用预先创建的 JPA 实体并创建了一个基本的 Web 应用程序。我的第一步是添加一个注册页面,这样我就可以创建一些用户并使用数据库身份验证登录(我设置了这个,但一旦注册页面工作就会对其进行测试)。我使用 seam-booking 示例来指导我(基本上将表单内容和其他字段集成到 seam-gen 应用程序的 View 中)。当我测试注册页面时,我得到了所有注入(inject)字段的 NullPointerExceptions。我已经查看了整个 seam-booking 示例,在网上搜索示例,并快速阅读了一本书的某些部分,但我没有看到哪里需要任何额外的配置信息。我到底做错了什么?请帮忙!!!

我正在使用 JBoss Server(社区版)5.1.0GA 和 Seam 2.2.0GA。

如果您需要比我发布的更多信息,请告诉我。提前感谢大家的帮助!!

有状态 EJB:

@Stateful
@Scope(EVENT)
@Name("register")
public class RegisterAction implements Register {
    @In
    private User user;

    @PersistenceContext
    private EntityManager entityManager;

    @In 
    private FacesMessages facesMessages;

    private String verify = null;

    private boolean registered = false;

    public void registerUser() {
        if (user.getPassword().equals(verify)) {
            List existing = entityManager
                    .createQuery(
                            "select u.userName from User u where u.userName=#{user.userName}")
                    .getResultList();
            if (existing.size() == 0) {
                entityManager.persist(user);
                facesMessages
                        .add("Successfully registered as #{user.userName}");
                registered = true;
            } else {
                facesMessages.addToControl("userName",
                        "Username #{user.userName} already exists");
            }
        } else {
            facesMessages.addToControl("verify", "Re-enter your password");
            verify = null;
        }
    }

    public void invalid() {
        facesMessages.add("Please try again");
    }

    public boolean isRegistered() {
        return registered;
    }

    public String getVerify() {
        return verify;
    }

    public void setVerify(String verify) {
        this.verify = verify;
    }

    @Remove
    @Destroy
    public void destroy() {
    }
}

EJB 本地接口(interface):

@Local
public interface Register
{
   public void registerUser();
   public void invalid();
   public String getVerify();
   public void setVerify(String verify);
   public boolean isRegistered();
   public void destroy();
}

注册页面的XHTML:

<ui:define name="body">
    <rich:panel>
        <f:facet name="header">Register</f:facet>
        <h:form id="registration">
            <fieldset><s:decorate id="firstNameDecorate"
                template="layout/edit.xhtml">
                <ui:define name="label">First Name:</ui:define>
                <h:inputText id="firstName" value="#{user.firstName}"
                    required="true">
                    <a:support id="onblur" event="onblur" reRender="firstNameDecorate" />
                </h:inputText>
            </s:decorate> <s:decorate id="lastNameDecorate" template="layout/edit.xhtml">
                <ui:define name="label">Last Name:</ui:define>
                <h:inputText id="lastName" value="#{user.lastName}" required="true">
                    <a:support id="onblur" event="onblur" reRender="lastNameDecorate" />
                </h:inputText>
            </s:decorate> <s:decorate id="emailDecorate" template="layout/edit.xhtml">
                <ui:define name="label">Email:</ui:define>
                <h:inputText id="emailAddress" value="#{user.emailAddress}"
                    required="true">
                    <a:support id="onblur" event="onblur" reRender="emailDecorate" />
                </h:inputText>
            </s:decorate> <s:decorate id="usernameDecorate" template="layout/edit.xhtml">
                <ui:define name="label">Username:</ui:define>
                <h:inputText id="username" value="#{user.userName}" required="true">
                    <a:support id="onblur" event="onblur" reRender="usernameDecorate" />
                </h:inputText>
            </s:decorate> <s:decorate id="passwordDecorate" template="layout/edit.xhtml">
                <ui:define name="label">Password:</ui:define>
                <h:inputSecret id="password" value="#{user.password}"
                    required="true" />
            </s:decorate> <s:decorate id="verifyDecorate" template="layout/edit.xhtml">
                <ui:define name="label">Verify Password:</ui:define>
                <h:inputSecret id="verify" value="#{register.verify}"
                    required="true" />
            </s:decorate>

            <div class="buttonBox"><h:commandButton id="register"
                value="Register" action="#{register.registerUser}" /> &#160; <s:button
                id="cancel" value="Cancel" view="/index.xhtml" /></div>
        </fieldset>
        </h:form>
    </rich:panel>
    </ui:define>
</ui:composition>

模板 XHTML(注册页面使用此):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<f:view xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a="http://richfaces.org/a4j"
xmlns:s="http://jboss.com/products/seam/taglib"
contentType="text/html">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <title>MyApp</title>
  <link rel="shortcut icon" href="#{request.contextPath}/favicon.ico"/>
  <a:loadStyle src="resource:///stylesheet/theme.xcss"/>
  <a:loadStyle src="/stylesheet/theme.css"/>
  <ui:insert name="head"/>
</head>
<body>
  <ui:include src="menu.xhtml">
     <ui:param name="projectName" value="MyApp"/>
  </ui:include>
  <div class="body">
     <h:messages id="messages" globalOnly="true" styleClass="message"
        errorClass="errormsg" infoClass="infomsg" warnClass="warnmsg"
        rendered="#{showGlobalMessages != 'false'}"/>
     <ui:insert name="body"/>
  </div>
  <div class="footer">
     <p>Powered by <a href="http://seamframework.org">Seam</a> #{org.jboss.seam.version} and <a href="http://www.jboss.org/jbossrichfaces">RichFaces</a>. Generated by seam-gen.</p>
     <s:fragment rendered="#{init.debug}">
     <a:log hotkey="D"/>
     <p style="margin-top: -0.5em;">
        Conversation: id = #{conversation.id}, #{conversation.longRunning ? 'long running' : 'temporary'}#{conversation.nested ? ', nested, parent id = '.concat(conversation.parentId) : ''}
        #{' - '}
        Ajax4jsf Log (Ctrl+Shift+D)
        #{' - '}
        <s:link id="debugConsole" view="/debug.xhtml" value="Debug console" target="debugConsole"/>
        #{' - '}
        <s:link id="resetSession" view="/home.xhtml" action="#{org.jboss.seam.web.session.invalidate}" propagation="none" value="Terminate session"/>
     </p>
     </s:fragment>
  </div>
 </body>
</html>
</f:view>

Seam Components.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
        xmlns:core="http://jboss.com/products/seam/core"
        xmlns:persistence="http://jboss.com/products/seam/persistence"
        xmlns:drools="http://jboss.com/products/seam/drools"
        xmlns:bpm="http://jboss.com/products/seam/bpm"
        xmlns:security="http://jboss.com/products/seam/security"
        xmlns:mail="http://jboss.com/products/seam/mail"
        xmlns:web="http://jboss.com/products/seam/web"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation=
            "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.2.xsd
             http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.2.xsd
             http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.2.xsd
             http://jboss.com/products/seam/bpm http://jboss.com/products/seam/bpm-2.2.xsd
             http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.2.xsd
             http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-2.2.xsd
             http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.2.xsd
             http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.2.xsd">

 <core:init debug="true" jndi-pattern="@jndiPattern@"/>

 <core:manager concurrent-request-timeout="500"
             conversation-timeout="120000"
             conversation-id-parameter="cid"
             parent-conversation-id-parameter="pid"/>

 <!-- Make sure this URL pattern is the same as that used by the Faces Servlet -->
 <web:hot-deploy-filter url-pattern="*.seam"/>

 <persistence:managed-persistence-context name="entityManager" auto-create="true"
                  persistence-unit-jndi-name="java:/MyAppEntityManagerFactory"/>

 <drools:rule-base name="securityRules">
  <drools:rule-files>
     <value>/security.drl</value>
  </drools:rule-files>
 </drools:rule-base>

 <security:rule-based-permission-resolver security-rules="#{securityRules}"/>

<security:identity-manager identity-store="#{jpaIdentityStore}" />

<security:jpa-identity-store
    entity-manager="#{entityManager}" user-class="my.app.path.dao.profiles.User"
    role-class="my.app.path.dao.profiles.Role" />

 <event type="org.jboss.seam.security.notLoggedIn">
  <action execute="#{redirect.captureCurrentView}"/>
 </event>
 <event type="org.jboss.seam.security.loginSuccessful">
  <action execute="#{redirect.returnToCapturedView}"/>
 </event>

 <mail:mail-session host="localhost" port="25"/>
</components>

最佳答案

赶时间的快速回答:

首先要解决 Seam 问题,“用户”是一个将自动创建的 Seam 组件,还是有一个工厂方法来创建一个?用@In 注释字段只是所需内容的一半,您仍然需要提供值的另一端。

大局观:

  • 假设 User 是一个实体,将它作为一个 Seam 组件并不是一个好的做法(Seam 造成的开销太多)。
  • 您的有状态 bean 被限定为一个 EVENT。这不太可能是您的愿望,Seam 中的 EVENT 范围与对 servlet 的请求相同。

看看您是否可以获得“Seam in Action”的副本,它很好地解释了基础知识。

关于java - Seam 不注入(inject)有状态的 EJB 依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2321015/

相关文章:

java - Seam 2,如何获取servletcontext?

java - 查找数据库表的唯一约束

java - javafx中的对话

c# - C# 或其他语言中的 Scala 风格抽象模块?

php - Symfony2 在测试中访问私有(private)服务

java - 对话范围和 jsf 重定向

java - SQLite 中的数据在应用程序更新时丢失

java - Android 基于 ListView /导航的应用程序

c# - Func<Owned<T>> 与 Func<T> 依赖关系

java - Seam/Hibernate validator 监听器