java - Struts2 中的有状态 session bean

标签 java struts2 ejb cdi stateful-session-bean

我一直在尝试使用 Struts2 创建一个简单的有状态 session bean,但是每次我重新发送请求并尝试检索之前放入有状态 bean 中的信息时,它都会返回 NULL。我错过了什么吗?

注册后注入(inject)工作正常,但是当我使用操作类中的检索方法发出新请求时,我无法获取 session 信息,因为它返回 null。

那么我该如何实现这一目标呢?

不要注意锁,我放它们只是为了测试其他功能。你可以忽略它们。我重复一下,注入(inject)在执行方法上正常工作

public class Registration extends ActionSupport implements ModelDriven<Account> {
    private static final long serialVersionUID = -8930461193700155653L;
    private Account account;
    private User user;

    @Inject // this is the interface implemented by my stateful bean
    AccountServiceLocal asl;

    @Inject
    PassHashInterface phi;

    @Inject
    UserServiceLocal usl;
    private final Lock lock =new ReentrantLock();

    @org.apache.struts2.interceptor.validation.SkipValidation
    public  String retrieve(){      
        if(asl.getEmail()!=null){ // always null        
            return "success";           
        }
        return "input";
    }
    public  String execute() throws NoSuchAlgorithmException,
                                    InvalidKeySpecException, 
                                    InterruptedException {

        user=new User();
        user.setEmail(account.getEmail().toString().trim());         
        System.out.println("in execute");
        account.setRole("Regular");
        account.setPwd(phi.createHash(account.getPwd()));
       /*
        * NB. the primary key in Account(AccountId) does not
        * Necessary matches the primary key in User(Id) 
        */         
        asl.create(account);
        usl.create(user);
        lock.unlock();          
        return "success";            
    }

    @Override
    public Account getModel() {
        account=new Account();
        return account;
    }
}

我的struts.xml文件

 <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">         
    <struts>            
        <constant name="struts.objectFactory.cdi.jndiKey" 
                 value="java:comp/some/weird/BeanManagerReference" />
        <package name="default" namespace="/" extends="struts-default">
            <action name="register" class="action.Registration"
                                   method="execute">
                <result name="success">success.jsp</result> 
                <result name="input">registration.jsp</result>
            </action>                
            <action name="save" class="action.Registration" 
                               method="retrieve">
                <result name="success" >index.jsp</result> 
                <result name="input" >registration.jsp</result>
            </action>               
        </package>
    </struts>

AccountserviceImpl:

@Stateful
public class AccountServiceImpl implements AccountServiceLocal {

    @Inject 
    private AccountDaoLocal adl;
    /* (non-Javadoc)
     * @see ejb.Business.AccountServiceLocal#create(ejb.Domain.Account)
     */
    @Override
    public void create(Account a) {
        // TODO Auto-generated method stub
        System.out.println("in"+this);
        adl.createdao(a);
    }

    /* (non-Javadoc)
     * @see ejb.Business.AccountServiceLocal#delete(java.lang.Object)
     */
    @Override
    public void delete(Object id) {
        // TODO Auto-generated method stub

    }

    /* (non-Javadoc)
     * @see ejb.Business.AccountServiceLocal#find(java.lang.Object)
     */
    @Override
    public Account find(Object id) {
        // TODO Auto-generated method stub
        return null;
    }

    /* (non-Javadoc)
     * @see ejb.Business.AccountServiceLocal#update(ejb.Domain.Account)
     */
    @Override
    public void update(Account a) {
        // TODO Auto-generated method stub

    }

    /* (non-Javadoc)
     * @see ejb.Business.AccountServiceLocal#findemail(java.lang.Object)
     */
    @Override
    public List findemail(Object id) {
        // TODO Auto-generated method stub

        return adl.finddaobyEmail(id);
    }

}

AccountServiceLocal:

@Local
public interface AccountServiceLocal {

    public void create(Account a);

    public void delete(Object id);

    public Account find(Object id);

    public List<?> findemail(Object id);

    public void update(Account a);

}

最佳答案

谢谢你们安德里亚和亚历山大。我使用的是 @Stateful 而不是 @Named @SessionScoped。无论如何,他们两个有什么区别。我使用的教科书使用 @Stateful 来引用有状态 bean。

关于java - Struts2 中的有状态 session bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30316605/

相关文章:

java - 对多个应用程序使用同一个 session

jsp - javax.el.PropertyNotFoundException : Property 'Name' not found on type

java - InitialContext.doLookup 两次调用 Bean 的构造函数

java - 如何显示按钮并在用户按下按钮时显示随机数?

java递归,查找字符串中目标的出现

properties - 在 Struts 2 中放置属性文件的位置?

java - 如何在有状态 session bean 上下文查找期间定义名称?

Java 调用 C 调用 Java

java - 如何写入文件并将该文件再次读取到临时文件中

Java 属性表