【问题标题】:EJB session bean does not initialize properly (NameNotFoundException)EJB 会话 bean 未正确初始化 (NameNotFoundException)
【发布时间】:2016-07-01 23:34:08
【问题描述】:

我无法弄清楚为什么 EJB 会话 bean 不工作。实际的错误消息是 EJBException:NameNotFoundException,但这不是一个很有启发性的消息。

我已经将其追溯到导致问题的确切原因,但还没有弄清楚原因。所以,我想创建一个会话 bean 来跟踪表单的输入值。

代码的精简版是:

public class rrpInputField {
   public boolean isRequired;
   public int maxLength;
   public String inputValue;
   public String displayValue;
   public String formatMask;
   public rrpInputField() {
     isRequired = false;
     maxLength  = 64;
     inputValue = "";
     displayValue = "";
     formatMask   = "";
  }
}

然后我创建了一个界面 dohicky...

@Local
public interface Test1  {
   public void   setAction(String action);
   public String getAction();
   public void   setName(String name);
   public String getName();
}

然后我自己创建了测试 bean...

@Stateful
public class Test1Bean implements Test1 {
   private String         action;
   private rrpInputField  name;

   @PostConstruct
   public void initialize() {
        action = "initalValue";
        //name.currentValue = "TestValue";

    @Override
    public void setAction(String action){ this.action = action; }

    @Override
    public void getAction() { return this.action; }

    @Override
    public void setName(String name) { this.name.currentValue = name; }

    @Override
    public String getName() { return this.name.currentValue; }

}

在我的测试 servlet 中,我有

 @EJB
 private  Test1   t1;

如果我在 bean 定义中取消注释 bean 初始化方法中的一行,我会失败。所以我知道这与此有关。 //name.currentValue = "TestValue";

如果我把它注释掉,只要我在 servlet 中编写 t1.getName("New Value") 代码,我就会得到同样的错误。

如果我把它注释掉,那么 bean 会按预期工作 - 我可以初始化,并使用 setAction 和 getAction 就好了。

我相当确定 rrpInput 类是正确的,因为我可以在 servlet 中编码:

   rrpInputField f1 = new rrpInputField();
   f1.currentValue  = "TestValue";

我认为它一定与我的输入字段类有关,但我没有运气弄清楚是什么。

【问题讨论】:

  • 听起来像一个基本的 NullPointerException。在您访问字段之前将实例分配给名称。 "name = new rrpInputField();"

标签: java servlets jakarta-ee stateful-session-bean


【解决方案1】:

我真的不明白为什么,但我通过在 Table1Bean 的初始化方法中添加一个“新”东西来让它工作。

@PostConstruct    
public void initialize() {
   action = "initialValue";
   name = new rrpInputField();
   name.currentVAlue = "TestValue;
}

如果有人能解释为什么我必须这样做,那将很有启发性。

猜你喜欢
  • 2012-04-04
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
相关资源
最近更新 更多