相关疑难解决方法(0)

无状态和有状态企业Java Bean

我正在阅读Java EE 6教程,我试图理解无状态和有状态会话bean之间的区别.如果无状态会话bean在方法调用之间不保持其状态,为什么我的程序按照它的方式运行?

package mybeans;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

@LocalBean
@Stateless
public class MyBean {

    private int number = 0;

    public int getNumber() {
        return number;
    }

    public void increment() {
        this.number++;
    }
}
Run Code Online (Sandbox Code Playgroud)

客户端

import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import mybeans.MyBean;
import java.io.PrintWriter;

@WebServlet(name = "ServletClient", urlPatterns = { "/ServletClient" })
public class ServletClient extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @EJB
    MyBean mybean;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws …
Run Code Online (Sandbox Code Playgroud)

java ejb java-ee stateful-session-bean ejb-3.1

89
推荐指数
5
解决办法
9万
查看次数

何时在无状态会话bean上使用有状态会话bean?

有状态会话bean定义如下:

有状态会话Bean对象的状态由其实例变量的值组成.在有状态会话bean中,实例变量表示唯一的客户端bean会话的状态.因为客户端与其bean交互("会话"),所以这种状态通常称为会话状态.

无状态会话bean定义如下:

无状态会话Bean无状态会话Bean不与客户端保持会话状态.当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅限于调用期间.方法完成后,不应保留特定于客户端的状态.但是,客户端可以更改池化无状态bean中的实例变量的状态,并且此状态将保留到池化无状态bean的下一次调用.除了在方法调用期间,无状态bean的所有实例都是等效的,允许EJB容器将实例分配给任何客户端.也就是说,无状态会话bean的状态应该适用于所有客户端.

使用无状态会话bean而不是有状态会话bean的优点如下:

由于无状态会话bean可以支持多个客户端,因此它们可以为需要大量客户端的应用程序提供更好的可伸缩性.通常,应用程序比有状态会话bean需要更少的无状态会话Bean,以支持相同数量的客户端.

所以我想到的问题是,何时应该使用有状态会话bean?为了我对这个问题的天真理解,我应该坚持使用无状态会话bean.

应该使用有状态会话bean的候选者是什么?有什么好例子吗?

会话Bean

java spring ejb stateless-session-bean stateful-session-bean

78
推荐指数
2
解决办法
7万
查看次数

何时需要或方便地将Spring或EJB3或它们全部一起使用?

混淆使用JSF2 + Spring + EJB3或它们的任意组合让我感到有些困惑.我知道Spring的一个主要特性是依赖注入,但是我可以使用JSF托管bean @ManagedBean@ManagedPropertyanotations,并获得依赖注入功能.使用EJB3,我更加困惑何时将其与JSF一起使用,或者甚至有理由使用它.

那么,在什么样的情况下使用Spring + JSF2或EJB3 + JSF2是个好主意?

到目前为止,我只使用JSF2创建了一些小型Web应用程序,从不需要使用Spring或EJB3.但是,我在许多地方看到人们正在将所有这些东西放在一起.

jsf spring ejb java-ee service-layer

39
推荐指数
2
解决办法
9689
查看次数

JSF服务层

我不确定我在JSF中使用MVC环境的方法是否是最好的方法.由于我想要充分利用JSF,我想知道我的服务层(或模型,用MVC术语说)应该如何"设计".

我知道视图 - 控制器比率应该是1比1(排除例外情况).现在我应该以什么方式设计我的服务层?我应该使用一项大型服务(不这么认为)吗?如果没有,根据我应该分割我的服务?

注意,我的服务将从Beans(控制器以MVC术语)调用,服务本身将在必要时使用JPA调用DAO.

提前致谢

java model-view-controller jsf service-layer

20
推荐指数
1
解决办法
1万
查看次数

使用@EJB时,每个托管bean是否都有自己的@EJB实例?

我正在使用JSF 2.2进行Web项目,现在我正在实现登录页面.

我有一个login.xhtml作为视图,一个名为的支持bean UserLoginView.
这个bean有一个EJB属性豆private UserService userService(如图所示这里).

这是否意味着每个UserLoginView新实例都获得了一个新实例UserService

可以在生产环境中像这样实现吗?

jsf ejb java-ee jsf-2.2

11
推荐指数
1
解决办法
2093
查看次数

在数据库中修改某些内容时,仅通过WebSockets通知特定用户

为了通过WebSockets通知所有用户,当在选定的JPA实体中修改某些内容时,我使用以下基本方法.

@ServerEndpoint("/Push")
public class Push {

    private static final Set<Session> sessions = new LinkedHashSet<Session>();

    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
    }

    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
    }

    private static JsonObject createJsonMessage(String message) {
        return JsonProvider.provider().createObjectBuilder().add("jsonMessage", message).build();
    }

    public static void sendAll(String text) {
        synchronized (sessions) {
            String message = createJsonMessage(text).toString();

            for (Session session : sessions) {
                if (session.isOpen()) {
                    session.getAsyncRemote().sendText(message);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当修改选定的JPA实体时,会引发适当的CDI事件,该事件将由以下CDI观察者观察.

@Typed
public final class EventObserver {

    private EventObserver() {}

    public void …
Run Code Online (Sandbox Code Playgroud)

java-ee websocket real-time-updates java-ee-7

10
推荐指数
1
解决办法
5802
查看次数

Stateless Session Beans和Request Scoped bean之间有什么区别

我知道无状态会话Bean是指EJB bean,而Request Scoped是指CDI bean(或JSF托管bean),因此我将首先从Java EE Tutoriel中提供它们的两个定义.

无状态会话Bean定义:

无状态会话bean不与客户端保持会话状态.当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅限于调用期间.方法完成后,不应保留特定于客户端的状态.

CDI Request Scoped定义:

用户在单个HTTP请求中与Web应用程序的交互.

我从这两个定义中理解的是,无状态会话bean的概念与请求范围概念相同,但我不确定,因为命名"会话"使我感到困惑.所以,我问自己是否是这种情况(相同的概念),也许他们会有类似的命名(使用请求而不是会话).

所以,我的问题是:EJB无状态会话bean和CDI/JSF请求范围bean之间是否有任何概念上的区别?

jsf scope ejb java-ee cdi

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

为什么无状态会话bean?

我正在阅读无状态会话bean,无法理解它的用法.

摘自下面的太阳教程

"..因为无状态会话bean可以支持多个客户端,它们可以为需要大量客户端的应用程序提供更好的可伸缩性"

在哪里使用无状态会话bean?什么样的应用程序使用它?

在"无状态会话bean"出现之前使用了什么机制来支持类似上下文中的多个客户端?

有人可以提供一些细节吗?

谢谢!

ejb stateless-session-bean java-ee

6
推荐指数
2
解决办法
6393
查看次数

如何为EJB中的下一次调用保留无状态bean的实例变量状态?

我正在阅读Java EE7文档,这就是无状态bean所说的内容.我对以下粗体标注的语句的含义感到困惑

无状态会话bean不与客户端保持会话状态.当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅限于调用期间.方法完成后,不应保留特定于客户端的状态.但是,客户端可以更改池化无状态bean中的实例变量的状态,并且此状态将保留到池化无状态bean的下一次调用.除了在方法调用期间,无状态bean的所有实例都是等效的,允许EJB容器将实例分配给任何客户端.也就是说,无状态会话bean的状态应该适用于所有客户端.

但是从这篇文章中, 无状态会话bean中的实例变量

无状态会话bean是一个没有关联的会话状态但可能具有实例状态的对象.它不允许并发访问bean.实例变量的内容不保证跨方法调用保留.客户端应认为无状态会话bean的所有实例都是相同的.

我觉得这里有矛盾.文档声称(根据我的理解)实例变量状态在下一次调用中保留,而后者声明无法保证状态得到保留.

请解释

PS:我确实看过这篇文章:但我没有理解答案

无状态会话bean中的实例变量

编辑形成上面的SO帖子

无状态会话Bean(SLSB)不依赖于一个客户端,并且无法保证一个客户端在每个方法调用时获取相同的实例(某些容器可能会在每个方法调用会话中创建和销毁bean,这是特定于实现的决策,但实例通常是合并的 - 我没有提到集群环境).换句话说,尽管无状态bean可能具有实例变量,但这些字段并非特定于一个客户端,因此不要在远程调用之间依赖它们.

state ejb java-ee

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

EJB注入与仅JSF托管bean

我不知道可能是我的问题完全没有意义,但我找不到任何关于它的直接信息.

我有我的JSF + Tomcat应用程序,它运行得很好.我想实现Restful服务和JAAS逻辑.为了做到这一点,我改用了TomEE ++.

切换到TomEE意味着我的服务器现在会更加沉重,我担心它比我在Amazon AWS微实例中需要的资源cpuram资源更多.

问题是:如果我只从JSF托管bean切换到JSF + EJB,性能是否会下降?

子问题是: EJB注入可以做什么,而JSF托管bean不能做什么?(例如,JSF不允许循环注入)

java jsf ejb java-ee apache-tomee

5
推荐指数
1
解决办法
3042
查看次数

访问无状态内的现有实例有状态,java ee 6

是否可以在无状态bean中访问有状态会话bean?

我的问题是我有一个名为User的会话bean,我想在无状态bean中访问用户信息...

我这样想:

Ejb Side:

@Stateless
public class OfferManagerBean implements OfferManagerLocal, OfferManager
{
    @Resource 
    private SessionContext context;
    @EJB
    private ro.project.ejb.interfaces.User user;
    public String getUsername()
    {
        user = (ro.project.ejb.interfaces.User) context.lookup("java:global/project/projectEJB/User!ro.project.ejb.interfaces.User");
        return user.getUsername();
}
Run Code Online (Sandbox Code Playgroud)

客户端

 User user = (User) ctx.lookup("java:global/project/projectEJB/User!ro.project.ejb.interfaces.User");
 user.setUsername("Alex");

 OfferManager offerManager = (OfferManager) ctx.lookup("java:global/project/projectEJB/OfferManagerBean!ro.project.ejb.interfaces.OfferManager");
 assertEquals(offerManager.getUsername(), "Alex");
Run Code Online (Sandbox Code Playgroud)

这个测试用例的结果是 java.lang.AssertionError: expected:<null> but was:<Alex>

它失败..似乎我如何请求有状态的bean返回一个新实例...

  1. 我知道为什么这不起作用.因为我的考试失败了:P.我得到一个新的实例..
  2. 我想检查EJB中登录用户的某些权限,因为我不想指望客户端因为我可能在那里犯了错误,或者我会告诉其他开发人员为我的项目制作GUI.
  3. 我不想使用Java EE安全因为我不知道如何在RCP应用程序中进行登录
  4. 我的主要问题是:如何在EJB中访问会话bean(客户端拥有的会话bean)..是否可能?如何?

我问的是这个人问的几乎一样的东西:rmi ejb调用中可重用登录会话的概念

我想这样做但不是JAAS ...

先感谢您

java-ee stateful-session-bean ejb-3.0

4
推荐指数
1
解决办法
4535
查看次数

EJB应该是实例变量并在JSF Managed Beans中标记为瞬态吗?

我们有几个带有Request,View和Session Scope的JSF托管bean,并且正在运行WebLogic 11g(10.3.2).Weblogic的不支持Managed Bean的一个JSF的@EJB注解,所以我们使用这些程序http://technology.amis.nl/2008/12/06/ejb-dependency-injection-of-session-bean-facade- in-jsf-12-on-weblogic-103-jsf-with-jpa /创建一个ServletConextListener,使用@EJB注释加载EJB引用.

实际上,从JSF Managed Bean中,我们可以通过从ServletContext获取它来查找我们希望使用的EJB的EJB接口.

所以问题是:

1)将EJB接口作为ManagedBean上的实例变量是否可以?(理由是在页面循环期间多次调用EJB)

2)如果我们确实将它们作为实例变量,我们是否应该将EJB接口实例变量标记为瞬态变量?

jsf ejb weblogic

2
推荐指数
1
解决办法
2775
查看次数

JPA和EJB - 我什么时候需要使用事务?

我正在学习一些教程后的Java持久性.

我正在使用Java EE 7和Payara服务器.

我注意到每个使用不同的持久性方法.

例子:

  • 简单

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void createOrUpdate(Book book) {
            em.persist(book);
        }
        public void remove(Book book) {
            em.remove(book);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • with flush(),这是在persistene.xml中的 "AUTO"上没有设置验证策略时使用的,对吧?

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void createOrUpdate(Book book) {
            em.persist(book);
            em.flush();
        }
        public void remove(Book book) {
            em.remove(book);
            em.flush();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 与交易

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void …
    Run Code Online (Sandbox Code Playgroud)

ejb jpa transactions jta java-ee

2
推荐指数
1
解决办法
1579
查看次数