我在将My xhtml页面连接到托管bean时遇到问题,commandButton上的操作有效,但是当传递值时它不起作用.这是我的jsf代码:
<h:form id="form" class="form-signin">
<p:panel id="panel" header=" Authentification" style="" >
<h:panelGrid columns="2" rowClasses="3">
<h:outputLabel for="login" value="Nom d'utilisateur :" styleClass=""/>
<p:inputText id="login" value=" #{authenticationBean.profil.login }" required="true" label="login" >
<f:validateLength minimum="4" />
</p:inputText>
<h:outputLabel for="password" value="Mot de passe :" />
<p:password id="password" value=" #{authenticationBean.profil.password }" required="true" label="password" styleClass=""/>
<p:row>
<p:commandButton id="loginButton" value="Login" ajax="false" action="#{authenticationBean.validate}" />
<h:messages id="messages" globalOnly="false"/>
</p:row>
</h:panelGrid>
</p:panel>
</h:form>
Run Code Online (Sandbox Code Playgroud)
我正在使用morphia将数据映射到mongo db,我还有一个名为profil和一个bean的权限来管理身份验证.这是我的认证bean代码:
public class AuthenticationBean implements Serializable {
private static final long serialVersionUID = 1L;
private Profil profil;
private …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我在持久层中使用JSF + JPA + CDI + WildFly 8.2.我有一个BasicDao,像这样:
public class BasicDao<M, K> {
private org.jboss.logging.Logger logger = org.jboss.logging.Logger
.getLogger("BasicDao");
@Inject
@Primary
protected EntityManager em;
Class<M> mclass;
public EntityManager getEm() {
return em;
}
public void setEm(EntityManager em) {
this.em = em;
}
@Transactional(value=TxType.NOT_SUPPORTED)
public M find(K id){
return em.find(mclass, id);
}
@Transactional(value=TxType.REQUIRED)
public void insert(M inst){
this.em.persist(inst);
}
@SuppressWarnings("unchecked")
@Transactional(value=TxType.REQUIRED)
public K insertWithAutoId(M inst){
this.em.persist(inst);
return (K) this.em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(inst);
}
@Transactional(value=TxType.REQUIRED)
public M update(M updated){
return this.em.merge(updated);
}
@Transactional(value=TxType.REQUIRED)
public void …Run Code Online (Sandbox Code Playgroud) 如何使用Java EE 6将EJB注入域对象(JPA实体)?
我想知道是否有可能观察到多个JSF 2.0会话作用域支持bean的CDI事件.我以为我可以通过观察事件将事件/数据推送到多个会话.
我已经设置了一个小测试,允许用户使用页面上的按钮触发事件(它与会话范围的支持bean中实际触发事件的方法相关联).我认为,如果我打开两个不同的浏览器,将创建两个会话,并且事件将通知每个会话范围的支持bean.
但是,当运行我的小测试并单击按钮以在其中一个浏览器上触发事件时,我看到该事件仅通知其中一个会话范围的bean.它只通知触发事件的bean(即 - 如果我单击浏览器1中的按钮,则会通知浏览器1中支持会话的会话范围bean,如果我单击浏览器2中的按钮,则支持会话的bean浏览器2被通知).
我的印象是事件会通知所有bean实例.但是,情况似乎并非如此.我能做到吗?我只是设置错误吗?
更新以显示我的代码:
用于触发事件并显示会话范围数据的jsfpage.xhtml片段:
Run Code Online (Sandbox Code Playgroud)<h:form> <h:outputText value="#{BackingBean.property}" /> <p:commandButton value="Fire Event" action="#{EventFirer.fireEvent}" /> </h:form>
接收事件的Session-scoped bean:
@Named
@SessionScoped
public class BackingBean implements Serializable {
private String property;
public String getProperty() {
return property
}
public void listenForChange(@Observes EventObj event) {
logger.log(Level.INFO, "Event received");
property = event.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
用于触发事件的应用程序作用域bean:
@Named
@ApplicationScoped
public class EventFirer implements Serializable {
@Inject
private Event<EventObj> events;
public String fireEvent() {
logger.log(Level.INFO, "Event fired");
events.fire(new EventObj());
return null;
}
}
Run Code Online (Sandbox Code Playgroud) 我试图@Inject一@SessionScoped豆成过滤器
@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {
@Inject
private LoginUser loginUser;
...
Run Code Online (Sandbox Code Playgroud)
这里LoginUser是@SessionScoped
目的是loginUser表示会话的登录用户.
问题是看起来我并不总是loginUser从当前会话中获取,因为一个会话的LoginUser对象正在与另一个会话共享,所以会话之间会出现"泄漏".显然这不好.
我想知道这是因为Filter对象是单例,还是至少在容器(glassfish)的请求和会话之间重用.(对?)
是否有更好的方法来获取LoginUser当前会话的对象而不使用Filter上的属性?
我们正在解开经典的传统单片EAR打包Java EE应用程序.我们(最复杂的)组件布线模式如下:组件A'需要'接口X,而组件B和C(... N)每个'提供'接口X.我们的要求是打包和部署A,B,C和X分开独立,以最大限度地减少停机时间并最大限度地减少业务影响.
因此,我们需要必要的健壮性,以允许在运行时删除和添加(重新部署)接口的提供者(B,C),而无需重新部署接口的消费者(A),也不需要重新启动服务器.该解决方案将在Wildfly 8上运行,但只要它们可以在Wildfly 8上运行,就可以使用它们或其他技术.
我们使用JBoss-OSGI和Weld-OSGI实现了POC,它满足了我们的所有要求,并为我们提供了出色的迁移路径.但是,在Wildfly 8 Alpha 3中,JBoss-OSGI已从默认发行版中删除.这让我们认为我们应该探索更符合Wildfly背后人们思想的替代方案.
因此,问题是,在Wildfly 8上,OSGI可以替代满足我们要求的模块间服务注入的替代方案是什么?
为了预算,简单性,性能开销和公司策略,我们必须消除以下内容:
1.远程EJB
2. Web服务
3. JSon/Rest
4. SCA
请注意,这不是要求就OSGI的可行性进行辩论,也不是对不同解决方案的评估或比较.我只是在寻找符合我们标准的任何解决方案,而不是基于OSGI.
我们有一个webapp,目前正在使用Java EE 7,JSF 2.2和Glassfish 4.0开发.有两个特定的托管bean,它们具有循环依赖性.
UsuarioController
@Named
@SessionScoped
public class UsuarioController implements Serializable {
/** snipet **/
@Inject
private EnderecoController enderecoController;
/** snipet **/
}
Run Code Online (Sandbox Code Playgroud)
EnderecoController
@Named
@ViewScoped
public class EnderecoController {
/** snipet **/
@Inject
private UsuarioController esuarioController;
/** snipet **/
}
Run Code Online (Sandbox Code Playgroud)
当webapp打包并部署到普通的glassfish 4.0安装时,它可以正常工作.
但是,在开发过程中,我们使用maven-embedded-glassfish在IDE内部进行本地测试.应用程序部署失败,出现以下异常.
SEVERE: Exception while loading the app : CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [EnderecoController] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject private net.jhm.exemplo.view.UsuarioController.enderecoController]
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [EnderecoController] …Run Code Online (Sandbox Code Playgroud) 如何在WildFly上完全禁用WELD.我不需要它,因为我使用另一个DI框架.
异常0:javax.enterprise.inject.UnsatisfiedResolutionException:无法使用限定符[@javax.enterprise.inject.Any(),@ javax.enterprise.inject解析'org.springframework.data.mongodb.core.MongoOperations'的bean .默认()].at org.springframework.data.mongodb.repository.cdi.MongoRepositoryExtension.createRepositoryBean(MongoRepositoryExtension.java:104)at the sun.reflect org.springframework.data.mongodb.repository.cdi.MongoRepositoryExtension.afterBeanDiscovery(MongoRepositoryExtension.java:79)at sun.reflect at.MativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method .java:606)在org.jboss.weld上的org.jboss.weld.inject.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93)org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266). event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserverMethodImpl.java:125)org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253)org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232)在org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:169)
我试过了
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:weld="http://jboss.org/schema/weld/beans"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd
http://jboss.org/schema/weld/beans http://jboss.org/schema/weld/beans_1_1.xsd
http://jboss.org/schema/weld/beans ">
<weld:scan>
<weld:exclude name="com.google.**"/>
<weld:exclude name="org.springframework.data.mongodb.**"/>
</weld:scan>
Run Code Online (Sandbox Code Playgroud)
但它没有解决我的问题.
我很难理解@DependentCDI 1.0和CDI 1.1中作用域的有效生命周期.到目前为止,我的实验得出了以下结论:
@Dependent作用域的bean没有代理.@PreDestroy当@Dependentbean被销毁时,不会调用任何方法.Provider.get()总是创建一个@Dependentbean 的新实例.@Dependent由@ApplicationScopedbean的Provider<>字段创建的bean 被"泄露",因为它仍然"属于" Provider.@Dependent类似Providers 泄漏豆类的证据(还有!).(虽然这可能是因为这些特定的 @Dependent bean是由@Produces方法创建的......!)我看到CDI 1.1已添加了一种destroy()方法Instance<>,可能是为了解决CDI 1.0中的内存泄漏问题.但那怎么样Provider<>- CDI 1.1中是否还会泄漏?(如果确实如此,那么你应该怎么用Provider.get()?)
基本上,我有几个@ApplicationScopedbean/@SingletonEJB,我@Inject Provider试图Provider.get()用作两者的工厂@Dependent和@RequestScoped"帮助"bean.我绝对不希望这些bean"属于"他们的Provider字段,因为我需要将bean随后进行垃圾收集:
public void updateStuff() {
Helper helper = …Run Code Online (Sandbox Code Playgroud) 这个问题之所以出现是因为我阅读了Arjan Tijms 关于 JSF 2.3 的博客文章。在那里,他列出了可以通过 CDI 注入的所有 JSF 工件。虽然HttpServletRequest提到了,HttpServletResponse但并没有出现在我一开始并不相信的上述清单上。
为了进行尝试,我设置了一个简单的服务器(JavaEE8、Wildfy22):
@Inject private HttpServletRequest req;工作得很好@Inject private HttpServletResponse res;投掷DeploymentException: WELD-001408: Unsatisfied dependencies for type HttpServletResponse我不明白为什么HttpServletResponse不应该注射。毕竟,我们的目标是通过简洁的注入来取代复杂的方法链。如果是HttpServletRequest,FacesContext.getCurrentInstance().getExternalContext().getRequest();现在可以缩短为上述注入。
好吧,在 的情况下HttpServletResponse,没有可替换的候选注入FacesContext.getCurrentInstance().getExternalContext().getResponse();,如上所示。
总结:为什么可以HttpServletRequest通过 CDI 注射但HttpServletResponse不能?