相关疑难解决方法(0)

在EJB方法/ @RequestScoped和@Stateless之间传递状态

我有一个@RequestScoped CDI bean,我想把它变成一个EJB来获取声明式事务.(我在EJB 3.1,Java EE 6上)

目前,我在子例程之间传递状态,假设实例仅用于单个请求.如果我@Stateless现在补充说假设会改变.

例如,我想做类似的事情

@Stateless
@Named
@RequestScoped
public class Foo {
  private String var1; // can't use instance vars in @Stateless?
  private String var2;

  public void transactionForRequest() {
    var1 = value; 
    var2 = value;
    ....
    subroutine();
  }
}
Run Code Online (Sandbox Code Playgroud)

我认为以上不起作用 - 这是正确的吗?

我正在考虑两种选择:

  • 使用@Stateful而不是@Stateless,以及@Named和@RequestScoped.
  • 保持@Stateless并使用EJBContext.getContextDatamap替换实例变量.

哪个更好?还有其他一些我没想到的选择吗?(除了等待Java EE 7或切换到Spring.:-))

ejb cdi java-ee-6 ejb-3.1

8
推荐指数
1
解决办法
5708
查看次数

如何在运行时向@SessionScoped bean提供@RequestScoped bean实例?

我正在阅读JBoss中的这个示例,其中使用@RequestScopedbean备份JSF page来传递用户凭据信息,然后将其保存在@sessionScoped bean.以下是JBoss文档的示例.

@Named @RequestScoped
public class Credentials {
    private String username;
    private String password;
    @NotNull @Length(min=3, max=25)
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    @NotNull @Length(min=6, max=20)
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
}
Run Code Online (Sandbox Code Playgroud)

JSF表格:

<h:form>
   <h:panelGrid columns="2" rendered="#{!login.loggedIn}">
      <f:validateBean>
         <h:outputLabel for="username">Username:</h:outputLabel>
         <h:inputText id="username" value="#{credentials.username}"/>
         <h:outputLabel for="password">Password:</h:outputLabel>
         <h:inputSecret id="password" …
Run Code Online (Sandbox Code Playgroud)

jsf ejb java-ee cdi managed-bean

7
推荐指数
1
解决办法
4190
查看次数

@RequestScoped将CDI注入@MessageDriven bean

如果我有一个@MessageDriven使用JMS 注入EJB 的请求作用域CDI bean ,如下所示,我可以假设任何给定的Foo实例一次只能由一次onMessage调用使用吗?

换句话说,在下面的例子中,我可以安全地在Foo对象中使用成员变量来跨子例程存储状态,类似于JSF @RequestScoped托管bean吗?

请注意,如果同一个Foo对象从一个onMessage调用顺序循环到下一个调用,则可以,只要每个MessageDrivenBean实例都有自己的Foo实例,这样就可以隔离两个并发处理请求.

 @MessageDriven
 public class MessageDrivenBean implements MessageListener {
    @Inject 
    private Foo foo;

    public void onMessage(Message m) {
      foo.doSomething();
    }
 }

 @Named
 @RequestScoped
 public class Foo {
   private String property;
     public void doSomething() {
       property = ...;
     }
 }
Run Code Online (Sandbox Code Playgroud)

jms java-ee message-driven-bean cdi java-ee-6

6
推荐指数
1
解决办法
3586
查看次数

为什么无状态EJB被合并?

Application Servers汇集无状态EJB的原因是什么?

我可以理解,控制应用程序的工作负载对于调用invokations是有用的,但这只能证明将服务器作为FAÇADE与调用者客户端一起汇集.

集成内部EJB(那些未公开且仅在内部调用以执行业务逻辑)的内容是否有任何好处?而不是使用共享的单个实例(像Spring一样).

我至少可以考虑一个缺点:高度使用的内部EJB可能成为瓶颈.

java spring ejb java-ee

6
推荐指数
1
解决办法
1418
查看次数

标签 统计

cdi ×3

ejb ×3

java-ee ×3

java-ee-6 ×2

ejb-3.1 ×1

java ×1

jms ×1

jsf ×1

managed-bean ×1

message-driven-bean ×1

spring ×1