我想@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可能被池化并在不同的会话中使用?
我想在 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) 有没有人知道使用JSF 2.0功能(Facelets,复合组件,模板,Ajax,导航等)的完整JSF 2.0示例或开源应用程序.学习一些最佳实践将是一个很好的参考.我在谈论你也将在生产中使用的应用程序.我所知道的只有ScrumToys和PetCatalog,它们随NetBeans 6.9一起提供,并且是"类似教程"的应用程序.
我正在尝试在单击按钮时执行 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)
我在这里遗漏了什么吗?
我正在将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对象.
我有一个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) 我想将我的应用程序转换为使用共享表支持多租户(即每个表都获得一个租户ID).显然,我将无法继续使用@Column(unique = true)
,因为它会强化所有租户的唯一性,这是我不想要的.
我正在使用带有EclipseLink的Glassfish 3.1.1.是否有办法使@Column(unique = true)
每个租户(而不是每个表)具有唯一性.或者我是否必须在业务逻辑中强制执行此操作?
我的JSF应用程序重定向未登录到登录页面的任何用户.当用户登录时,我希望应用程序重定向到用户最初在浏览器的地址栏中输入的页面.但我不知道如何访问用户最初输入的URL,因为他被自动重定向到我在web.xml中配置的登录页面.
java ×3
java-ee ×3
glassfish ×2
jsf ×2
jsf-2 ×2
ajax ×1
aspectj ×1
cdi ×1
eclipselink ×1
glassfish-3 ×1
javascript ×1
jms ×1
jpa ×1
jpa-2.0 ×1
multi-tenant ×1
transactions ×1