小编The*_*heo的帖子

从EJB无状态会话bean调用CDI会话范围的生产者方法

我想@Inject @Current User在所有层(即web层,EJB层)中使用当前用户.为此,我有以下CDI Producer方法:

@Named
@SessionScoped
public class UserController {
   @Resource SessionContext sessionContext;
   @EJB UserDao userDao;

   @Produces @Current
   public User getCurrentUser() {
     String username = sessionContext.getCallerPrincipal().getName();
     User user = userDao.findByUsername(username);
   }
}

@Qualifier
@Target({TYPE, METHOD, PARAMETER, FIELD})
@Retention(RUNTIME)
public @interface Current{}
Run Code Online (Sandbox Code Playgroud)

现在,我想将当前用户注入EJB无状态会话bean,如下所示:

@Stateless
public class SomeBackendService {
   @Inject @Current
   private User user;
}
Run Code Online (Sandbox Code Playgroud)

我的问题:当前用户对象是否总是在会话更改后重新注入,因为无状态会话bean的依赖关系通常在创建时注入一次,并且bean可能被池化并在不同的会话中使用?

java java-ee cdi

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

如何在 JPA 领域模型中实现状态设计模式

我想在 JPA 中实现状态设计模式。这篇博文中概述了我目前的做法。

作者使用包含所有可用状态实现的枚举,而不是为状态抽象创建抽象类/接口并为每个状态编写实现。我发现这种方法非常有用,因为枚举可以在 JPA 中轻松序列化,并且您可以无需额外工作即可存储对象的当前状态。我还将状态接口和所有状态类嵌套到枚举中,使它们成为私有的,因为它们是特定于实现的,不应该对任何客户端可见。这是枚举的代码示例:

public enum State {

  STATE_A(new StateA()),
  STATE_B(new StateB());

  private final StateTransition state;

  private State(StateTransition state) {
     this.state = state;
  }

  void transitionA(Context ctx) {
    state.transitionA(ctx);
  }

  void transitionB(Context ctx) {
     state.transitionB(ctx);
  }

  private interface StateTransition {

    void transitionA(Context ctx);

    void transitionB(Context ctx);
  }

  private static class StateA implements StateTransition {

    @Override
    public void transitionA(Context ctx) {
        // do something
    ctx.setState(STATE_B);
    }

    @Override
    public void transitionB(Context ctx) {
        // do something
    ctx.setState(STATE_A);
    } …
Run Code Online (Sandbox Code Playgroud)

java design-patterns jpa aspectj

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

JSF 2.0示例或开源应用程序

有没有人知道使用JSF 2.0功能(Facelets,复合组件,模板,Ajax,导航等)的完整JSF 2.0示例或开源应用程序.学习一些最佳实践将是一个很好的参考.我在谈论你也将在生产中使用的应用程序.我所知道的只有ScrumToys和PetCatalog,它们随NetBeans 6.9一起提供,并且是"类似教程"的应用程序.

jsf-2

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

JSF:一起使用 onclick + actionListener

我正在尝试在单击按钮时执行 JavaScript 并同时在后台设置属性。执行 JS 代码有效,但未调用属性操作侦听器。但是,当我删除 onclick 属性时,单击命令按钮时将在后台设置属性。我也尝试过使用 actionListener。但同样的问题。这是我的 JSF 代码:

<rich:dataTable value="#{bean.items}" var="item">
  <rich:column>
    <a4j:commandButton value="Upload" onclick="Richfaces.showModalPanel('p-id');return false;">
       <f:setPropertyActionListener target="#{bean.targetId}" value="#{item.id}" />   
   </a4j:commandButton>
 </rich:column>
 // more columns
</rich:dataTable>
Run Code Online (Sandbox Code Playgroud)

我在这里遗漏了什么吗?

javascript ajax jsf

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

Glassfish TimerService:更新vom GF 3.1到4.1时TimerHandle中的异常反序列化

我正在将GF 3.1.2.2中的Java EE 6应用程序更新到4.1.应用程序大量使用EJB计时器服务并TimerHandle在DB中保留对象.

在DB中访问这些计时器句柄时,我得到以下异常:

Exception [EclipseLink-66] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Could not deserialize object from byte array.
Internal Exception: java.io.InvalidClassException: com.sun.ejb.containers.TimerWrapper$TimerHandleImpl; local class incompatible: stream classdesc serialVersionUID = 8013326429831986199, local class serialVersionUID = -7638766191514989908
Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping[timerHandle-->MESSAGE.TIMERHANDLE]
Descriptor: RelationalDescriptor(com.example.Message --> [DatabaseTable(MESSAGE)])
Run Code Online (Sandbox Code Playgroud)

显然,串行版本ID已从GF 3.1更改为4.1.任何想法如何在GF 4.1中重用那些TimerHandle对象.

java glassfish

5
推荐指数
0
解决办法
119
查看次数

JMS事务问题

我有一个JMS和事务的问题,我不完全理解.我的应用程序有一个JDBC资源和两个JMS队列.队列的消息生成器是在同一个jms会话对象的同一个无状态会话bean中创建的.我使用队列的方式如下:创建一个权限,并将其id作为属性保存在JMS消息中并发送到队列.实体的创建和对队列的提交发生在同一事务中.然后,我的消息驱动bean通过JMS消息中的ID从数据库中检索实体并对其进行处理.

代码看起来大致如下:

public long doSomething(String message) {
        SomeObject obj = new SomeObject(message);
        entityManager.persist(obj)

       // submit to JMS queue
      try {
            Message jmsMessage = session.createMessage();
            jmsMessage.setLongProperty("id", obj.getId());
            messageProducer.send(jmsMessage);
        } catch (JMSException ex) {
            Logger.getLogger(NotificationQueue.class.getName()).log(Level.SEVERE, null, ex);
        }

       return obj.getId();
}
Run Code Online (Sandbox Code Playgroud)

MDB的onMessage方法:

public void onMessage(Message message) {
        Long id;
        try {
            id = message.getLongProperty("id");
        } catch (Exception ex) {
            Logger.getLogger(AlertMessageListener.class.getName()).log(Level.SEVERE, null, ex);
            throw new EJBException(ex);
        }

        SomeObject obj = entityManager.find(SomeObject.class, id);
        obj.process();
 }
Run Code Online (Sandbox Code Playgroud)

在onMessage()方法中从数据库中检索实体时,日志文件中会出现以下异常:

FINE: ENTRY com.test.app.alert.control.AlertMessageListener onMessage
FINE: ENTRY com.test.app.alert.control.MessageDao find …
Run Code Online (Sandbox Code Playgroud)

transactions jms glassfish java-ee glassfish-3

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

如何在多租户环境中使用JPA @Column(unique = true)?

我想将我的应用程序转换为使用共享表支持多租户(即每个表都获得一个租户ID).显然,我将无法继续使用@Column(unique = true),因为它会强化所有租户的唯一性,这是我不想要的.

我正在使用带有EclipseLink的Glassfish 3.1.1.是否有办法使@Column(unique = true)每个租户(而不是每个表)具有唯一性.或者我是否必须在业务逻辑中强制执行此操作?

eclipselink java-ee multi-tenant jpa-2.0

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

JSF 2.0:如何获取在浏览器地址栏中输入的URL

我的JSF应用程序重定向未登录到登录页面的任何用户.当用户登录时,我希望应用程序重定向到用户最初在浏览器的地址栏中输入的页面.但我不知道如何访问用户最初输入的URL,因为他被自动重定向到我在web.xml中配置的登录页面.

jsf jsf-2

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