在我将一些数据提交到数据库之后,我希望我的会话bean自动刷新自己以反映最近提交的数据.在JSF 2.0中使用托管会话bean时,如何实现这一目标?
目前,我必须重新启动Web服务器才能清除会话并重新加载.
在我的应用程序中,我们在某些地方使用 @ManagedBean 注释对 Person bean 和我们在 faces-confing.xml 中定义的同一个 Person bean 同时使用,如下所示。
@ManagedBean("name=person")
@SessionScoped
Public class Person{
}
Run Code Online (Sandbox Code Playgroud)
人脸配置文件
<managed-bean>
<managed-bean-name>person</managed-bean-name>
<managed-bean-class>com.test.sample.Person</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Run Code Online (Sandbox Code Playgroud)
我的问题是这种方法是否为 Person bean 创建了两个实例,或者如果我这样做很重要?如果我对应用程序中的每个 Bean 都这样做,这对我的应用程序的性能有什么影响吗?
容器是 Glassfish 4.1
我现在对 CDI 有一个非常奇怪的问题。如果我不注释我的NumberGenerator服务@Dependent,那么当我运行应用程序时,我会不断收到不满意的注入点错误。但是如果我明确地注释我的NumberGenerator实现,那么一切都会起作用。一句话,如果我想使用@Dependent默认作用域进行依赖注入,我必须明确指定它。
public interface NumberGenerator {
String generateNumber();
}
Run Code Online (Sandbox Code Playgroud)
第一次实施 NumberGenerator
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
@ThirteenDigits
@Dependent
public class IsbnGenerator implements NumberGenerator {
@Inject
private Logger logger;
@Override
public String generateNumber() {
String isbn = "13-84356-" + Math.abs(new Random().nextInt());
logger.log(Level.INFO, "Generated ISBN : {0}", isbn);
return isbn;
}
}
Run Code Online (Sandbox Code Playgroud)
第二次实施 NumberGenerator
import java.util.Random;
import java.util.logging.Logger;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
@EightDigits
@Dependent
public …Run Code Online (Sandbox Code Playgroud) dependency-injection glassfish cdi managed-bean glassfish-4.1
为了获得当前日期,我在faces-config.xml下面声明了一个托管bean 。
<managed-bean>
<managed-bean-name>currentDate</managed-bean-name>
<managed-bean-class>java.time.ZonedDateTime</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
Run Code Online (Sandbox Code Playgroud)
之前,我一直在使用org.joda.time.DateTime并且工作正常。可以像下面这样在EL中访问此bean。
<h:outputText value="#{currentDate}" converter="#{converter}"/>
Run Code Online (Sandbox Code Playgroud)
但是,这导致引发以下异常。
16:15:29,984 SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (default task-16) Error Rendering View[/admin_side/Home.xhtml]: com.sun.faces.mgbean.ManagedBeanCreationException: Unable to create managed bean currentDate. The following problems were found:
- Managed bean class java.time.ZonedDateTime for managed bean currentDate doesnt declare a public no-argument constructor.
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:265)
at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:257)
at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:117)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:116)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)
at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
at javax.faces.component.UIOutput.getValue(UIOutput.java:174)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
at …Run Code Online (Sandbox Code Playgroud) 我使用@ManagedBean(请求作用域)作为@ManagedProperty另一个内部@ManagedBean.但是,在使用时bean(一个用作a @ManagedProperty)是未实例化的,因此导致NullPointerException.
我该如何解决这个问题?
我有一个 <h:commandButton>
<f:metadata>
<f:viewParam name="uri" value="#{pesquisaBean.selectedUri}" />
<f:event listener="#{pesquisaBean.searchElement()}" type="preRenderView"></f:event>
</f:metadata>
<h:head>
<title>Detalhes do Documento</title>
</h:head>
<h:body>
<br />
Detalhes do Documento
<br />
<br />
<rich:dataTable value="#{pesquisaBean.documentDetailsByTitle}" var="result">
<c:forEach items="#{pesquisaBean.variableNamesDetails}" var="vname">
<rich:column>
<f:facet name="header">#{vname}</f:facet>
#{result[vname]}
</rich:column>
</c:forEach>
</rich:dataTable>
<br />
<h:commandButton value="Excluir" action="#{pesquisaBean.delete()}" />
<br />
<br />
Run Code Online (Sandbox Code Playgroud)
和这个行动方法
public void delete() {
System.out.println("Hello");
this.removeDocument(databaseModel, this.selectedDocument);
System.out.println("");
System.out.println("After deleting!!!!!!!!!!!!");
StmtIterator result = databaseModel.listStatements();
while( result.hasNext() ) {
Statement stmt = result.next();
System.out.println(stmt);
}
Run Code Online (Sandbox Code Playgroud)
但是,命令按钮不会调用操作方法.我正在尝试Hello在方法的第一行打印,但它没有打印.
这是怎么造成的,我该如何解决?
这是@ApplicationScoped在@SessionScopedbean中注入bean 的正确方法吗?这会导致我的应用程序作用域bean存储在每个用户的会话中吗?
我有一个应用程序范围的bean,它包含我们在所有系统用户之间共享的一些值,现在我需要在会话bean的方法中获取这些值.
在Xpage中,我需要计算多个checkBox控件的禁用属性.所以我为此构建了一个javaBean并将其注册为managedBean.原则上它就像一个魅力:一个computedField控件的value属性使用EL绑定到bean的一个私有变量:
value="#{myBean.myTestValue}"
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它显示了正确的内容.
接下来,我将checkBox的disabled属性绑定到我的bean中计算的私有布尔变量,再次使用EL:
disabled="#{myBean.isCheckBoxDisabled}"
Run Code Online (Sandbox Code Playgroud)
不幸的是,这次javax.faces.el.PropertyNotFoundException抛出了.
作为一种解决方法,我创建了一个getter方法,然后我从checkBox的disabled属性调用,这次作为JS代码:
disabled="#{javascript:myBean.isCheckBoxDisabled()}
Run Code Online (Sandbox Code Playgroud)
这是按预期工作,已设置disabled属性.这对我来说基本没问题虽然我本来喜欢用EL做这件事,因为这似乎是最佳实践.
问题是:为什么控件的value属性可以使用bean的私有变量而disabled属性不能?
我在JSF 2.2中使用Spring启动.我的问题是我可以创建@ManagedBean,javax.annotation.ManagedBean当我运行应用程序时它在我的index.xhtml中工作,但是当我想使用时javax.faces.bean.ManagedBean不显示值.这两者有什么区别?为什么我不能用 javax.faces.bean.ManagedBean?(我没有web.xml文件,所有都在类中配置)
我有两个托管Java Bean:
import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.ws.rs.Path;
@Path("/sync")
@ManagedBean(name="syncService", eager=true)
@ApplicationScoped
public class SyncService {
@ManagedProperty(value="#{ldapDirectoryAccess}")
private DirectoryAccess directoryAccess;
public void setDirectoryAccess(DirectoryAccess directoryAccess) {
System.out.println("SyncService.setDirectoryAccess()");
this.directoryAccess = directoryAccess;
}
public SyncService() {
System.out.println("SyncService() - constructed: " + this);
}
@PostConstruct
public void init() {
System.out.println("DirectoryAccess injected: " + directoryAccess + " in: " + this);
}
...
}
@ManagedBean(name="ldapDirectoryAccess", eager=true)
@ApplicationScoped
public class LdapDirectoryAccess implements DirectoryAccess {
public LdapDirectoryAccess() {
System.out.println("LdapDirectoryAccess constructed: " + this); …Run Code Online (Sandbox Code Playgroud) managed-bean ×10
jsf ×7
cdi ×2
faces-config ×2
action ×1
glassfish ×1
java ×1
java-time ×1
javabeans ×1
jsf-2 ×1
jsf-2.2 ×1
session-bean ×1
spring ×1
spring-boot ×1
xpages ×1
xpages-ssjs ×1