是否可以执行以下操作:当用户会话启动时,我从数据库中读取某个完整属性.当用户在此会话中执行某些活动时,我更新该变量(存储在会话中)并在会话结束时,然后我最终将该值存储到数据库中.
我的问题是如果用户会话结束我如何识别使用JSF框架然后我应该将值存储回DB?
有没有办法在复合组件中设置托管bean参数,然后让使用类来决定使用哪个实际托管bean?
类似的东西: comp.xhtml
<cc:interface>
<cc:attribute name="price" />
<cc:param name="pageBean" value="#{superBean}" />
<cc:interface>
<cc:implementation>
<h:outputText value="#{cc.attrs.price}"/>
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)
然后,在使用页面中
<ezcomp:comp pageBean="actualBean"
price="#{actualBean.price}" >
</ezcomp:comp>
Run Code Online (Sandbox Code Playgroud)
在我的例子中,ActualBean是SuperBean的子类型.
我甚至不确定这是可能的,但我们只是说如果有人证明我错了会很棒.
先感谢您
我有一堆热切的 ApplicationScoped托管bean.其中一些通过ManagedProperty注释注入到其他注释中,形成依赖树.每个依赖bean在构造后操纵其父级.
但是,似乎为每次注射创建了一个新实例,从而使之前的操作无法完成.根据我的理解,ApplicationScopedbean应该只创建一次.我误解了或者为什么会这样?是因为他们渴望吗?
这是一个例子:
package example;
import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
@ManagedBean(eager = true)
@ApplicationScoped
public class ParentBean
{
static int initCount = 0;
// ...
@PostConstruct
public void init()
{
++initCount; // Will end up being between 1 and 3. Expected always 1.
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
package example;
import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
@ManagedBean(eager = true)
@ApplicationScoped
public class Child1Bean
{
@ManagedProperty("#{parentBean}") ParentBean parentBean;
public ParentBean …Run Code Online (Sandbox Code Playgroud) 我正在使用类的层次结构,我最好尝试做的是@ManagedBean继承一个具有@ManagedProperty成员和@PostConstruct方法的类.
具体来说,这会有用吗?:
public class A {
@ManagedProperty
private C c;
@PostConstruct
public void init() {
// Do some initialization stuff
}
public C getC() {
return c;
}
public void setC(C c) {
this.c = c;
}
}
@ManagedBean
@SessionScoped
public class B extends A {
// Content...
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我用@ApplicationScoped注释了一个类.使用@Inject,我将这个类的实例注入到几个@RequestScopded JAX-RS服务中:
@ApplicationScoped
public class MySingleton {
MySingleton() {
System.out(this + " created.");
}
}
@RequestScoped
public class MyRS {
@Inject MySingleton mySingleton;
public void someMethod() {
// do something with mySingleton
}
}
Run Code Online (Sandbox Code Playgroud)
基本上这很好用.Howeger,至少当我在WebSphere 8.5中运行它时,MySingleton的构造函数被调用两次,导致输出像
my.package.MySingleton_$$_javassist_26@cddebf9b created.
my.package.MySingleton@e51e26d1 created.
Run Code Online (Sandbox Code Playgroud)
我打算在构造函数中做一些昂贵的初始化,显然会执行两次.
我相信其中一个构造函数调用是为实际的"worker"实例生成某种代理.但是如何避免我的初始化代码执行两次?在MySingleton的所有方法中进行延迟初始化的"解决方案"并不是很有吸引力.
一句话:@ManagedProperty注解返回null而不是注入属性。
详细信息:有两个类:
@ManagedBean(name="authFilter")
@SessionScoped
public class AuthFilter implements Filter {
@ManagedProperty("#{loginBean}")
private LoginBean loginBean;
public void setLoginBean(LoginBean loginBean) {
this.loginBean = loginBean;
}
...
}
Run Code Online (Sandbox Code Playgroud)
和
@ManagedBean(name="loginBean")
@SessionScoped
public class LoginBean {
...
}
Run Code Online (Sandbox Code Playgroud)
现在,AFAIK的@ManagedProperty注解和设置器应该足以注入属性,或者至少此处和BalusC的博客中的其他问题建议了这一点,但仍然始终存在null。
这也很有趣,并且可能与此问题有关,我收到这些类的警告,即使它们仅通过faces-config.xml或带有注解进行了注册,但它们已经被注册为托管bean 。(分别对它们进行了试验,没有任何区别。)如果它们都不存在,则警告消失,但是对c无效@ManagedProperty。
WARNING: JSF1074: Managed bean named 'confListBean' has already been registered. Replacing existing managed bean class type <projectname>.web.authFilter with <projectname>.web.authFilter.
Run Code Online (Sandbox Code Playgroud)
因此,问题将是:
@ManagedProperty要注入我没有做的事情还需要什么?@notations和之外,还可以“过度注册”这些托管Bean faces-config.xml吗?是否存在收集我可以检查的托管bean的过程的跟踪?我已经阅读了一些关于自定义控件中动态绑定字段的优秀帖子和文章,但他们都假设了一个文档数据源.
我想允许托管bean数据源的可能性.我尝试将属性类型设置为com.ibm.xsp.model.DataSourceor,com.ibm.xsp.extlib.model.ObjectDataSource并且这些都不适用于以下xml:
<xp:inputText
id="input"
value="${compositeData.dsn[compositeData.fieldName]}"
>
</xp:inputText>
Run Code Online (Sandbox Code Playgroud)
在使用控件的地方,我传递了自定义数据,如下所示:
<xc:input
dsn="#{issue}"
fieldName="Database"
>
</xc:input>
Run Code Online (Sandbox Code Playgroud)
为了我的测试目的,我有一个名为的托管bean issue,我调用了我的字段Database.我通常会绑定#{issue.Database}但我无法弄清楚如何动态地这样做.理想情况下,我也想支持文档数据源,但如果我不能同时支持,那么我需要绑定到托管bean.
编辑:问题似乎是数组符号.如果我硬编码我的价值#{issue.Database}它有效,但如果我硬编码#{issue[Database]}它失败.所以问题是是否存在点符号的替代表示.我今天没有时间,但我想知道如果我只是将#{issue}传递给dsn而不是将dsn和fieldName分开并使用它作为我的数据绑定会有效吗?当我有机会时,我会尝试.
Edit2:因为看起来问题可能与我正在使用的bean有关,我将在这里发布代码.
AbstractMapModel
public abstract class AbstractMapModel implements Serializable, DataObject {
private static final long serialVersionUID = 1L;
private Map<Object, Object> values;
public Class<?> getType(final Object key) {
Class<?> result = null;
if (getValues().containsKey(key)) {
Object value = getValues().get(key);
if (value != null) {
result = value.getClass();
}
}
return result;
} …Run Code Online (Sandbox Code Playgroud) 我有一些遗留代码,使用如下代码将对象作为http会话属性:
MyObject object = new MyObject();
Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
sessionMap.put("attrname", object);
Run Code Online (Sandbox Code Playgroud)
旧的facelets使用了访问代码
@ManagedProperty("#{attrname}")
private MyObject object;
Run Code Online (Sandbox Code Playgroud)
有没有办法使用CDI(@Inject)将此会话属性注入Bean?
在使用CDI的新代码中,创建和注入需要以受控方式创建的对象的更好方法是什么.
我有2个JSF托管bean A,B我需要A在2分钟B后和5分钟后过期/销毁/销毁.我检查了这个相关的问题,从一个bean中定时,但是整个会话到期了.我不想让整个会话到期.
如何使用自定义范围实现此目的?
我正在使用Mojarra 2.2.12,在我们的项目中我们有一些@ApplicationScoped豆子.例如:
@ManagedBean
@ApplicationScoped
public class AppScopedBean{
private int commonValueForClients;
//GET, SET
public void evalNew(){
int newCommonVal;
//Evaluation of the new value, doesn't depend on the commonValueForClients
commonValueForClients = newCommonVal;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我们应该担心新指定值的可见性吗?
我在规范中找不到JSF基础结构必须同步访问@ApplicationScopedbean字段.因此,特别是对于Mojarra 2.2.12,我们应该将字段声明为volatile或明确地同步对它的访问吗?
managed-bean ×10
jsf ×6
jsf-2 ×5
cdi ×2
java-ee ×2
session ×2
annotations ×1
concurrency ×1
constructor ×1
editbox ×1
facelets ×1
java ×1
listener ×1
scope ×1
subclass ×1
xpages ×1