正如用户之前在另一个问题中建议的那样,我需要在另一个bean中注入一个bean.
所以,我做以下事情:
@ManagedBean
@RequestScoped
public class Articles {
private String selectedMenu;
@ManagedProperty(value="#{user}")
private UserManager user;
@PostConstruct
public void init() {
if(selectedMenu==null || selectedMenu.trim().isEmpty()) {
this.selectedMenu="0";
}
}
// now here i should access to user.methods
// getter and setter
}
Run Code Online (Sandbox Code Playgroud)
实际上,我无法访问UserManager数据.我收到这些错误:
BROWSER malformedXML: INVALID_STATE_ERR: Dom Exception 11
服务器日志
30-nov-2010 15.36.58 javax.faces.component.UIViewRoot$ViewMap put
AVVERTENZA: Setting non-serializable attribute value into ViewMap: (key: profileSelector, value class: model.ProfileSelector)
30-nov-2010 15.36.59 com.sun.faces.mgbean.BeanManager preProcessBean
GRAVE: JSF will be unable to create managed bean articles when it …
我使用@Startup
注释在EJB中的部署过程中设置入口点,但它不起作用.请参阅以下代码示例:
@Singleton
@Startup
public class SchedulerManager {
private static Logger log = Logger.getLogger(SchedulerManager.class);
@PostConstruct
public void atStartup() {
System.out.println("stutrup!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用JBoss5.1.0
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
请给我建议我做错了什么.
谢谢!阿尔乔姆
我对JSF很新,并没有真正"习惯"不同的思维,所以我在努力(我假设)是基本的.
假设我有一个类User,它是一个会话bean.
假设我有10000个对象的控制器,比如Factory,它需要能够将它们中的一些设置为"锁定",在我们的例子中,它意味着"锁定"字段不再变为空,而是引用"LockedItem"宾语.
这是我无法工作的地方:LockedItem,当你实现它时,应该引用当前登录的用户.我该怎么做?
我尝试使用@managedproperty进行注入,但是在LockedItem.constructor中它是null(这是正常的我假设)然后我尝试了@PostConstruct方法,但是这个方法永远不会被调用(为什么?即使我把它变成了一个托管bean ...是只有在".xhtml"创建对象时调用的postconstruct方法?)或者我应该使用"java se"技巧,比如使用户静态?
代码澄清为什么没有调用@PostConstruct("Seat"之一):
.xhtml
<h:outputLabel id="user" value="Hello #{user.name}" />
<h:outputLabel id="car" value="you have #{car.brand}" />
Run Code Online (Sandbox Code Playgroud)
用户
package test;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class User implements Serializable {
private String name ;
public User()
{
name = "toto";
System.out.println("User constructor");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
汽车
package test;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
@ManagedBean
public class Car implements Serializable …
Run Code Online (Sandbox Code Playgroud) jsf design-patterns code-injection postconstruct managed-bean
我得到了一个如下所示的无状态bean:
@Stateless
public class MyBean implements IMyBean {
@Inject
private SomeClass someClass;
@EJB
private MyRepository myRepository;
@Production
@Inject
private SomeFacade someWorker;
@PostConstruct
private void init() {
// some logic ...
}
// some more logic...
}
Run Code Online (Sandbox Code Playgroud)
IMyBean带有@Local注释。我正在运行JBoss服务器。我得到了一个使用MyBean的.bat文件。仅在第一次执行此bat文件时,才调用@PostConstruct。这是为什么?MyBean属于哪个范围?似乎至少是ApplicationScoped。我以为那是RequestScope ...
我有以下课程:
@Repository
class A {
public void method1() {
...
}
}
@Component
class B implements C {
@Autowired
@Lazy
private A a;
public void method2() {
a.method1();
}
}
@Component
class D {
@Autowired
private List<C> c;
@PostConstruct
public void method3() {
// iterate on list c and call method2()
}
}
Run Code Online (Sandbox Code Playgroud)
让我们假设Spring将bean初始化如下:
1.创建第一个bean B. 当创建bean B时,a
由于@Lazy
注释,将不会初始化字段.
2.创建下一个bean D. 然后method3()
将被标记为执行@PostConstruct
,但Spring尚未触及bean A. 因此,当调用a.method1()时,Spring会创建bean A并将其注入字段中a
还是会抛出NullPointerException
?
我正在使用 Spring Boot 并且我在我的 JPA 实体中添加了 @PostConstrcut 注释,如图所示,但是当实体被实例化时,这个拦截器永远不会被调用。
@Entity
public class MyTableName implements java.io.Serializable {
// all attributes
@PostConstruct
public void init(){
// This code never called
System.out.println("PostConstruct");
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个计划任务,每天晚上汇总数据。每当我启动应用程序时,任务就会运行,当我在应用程序上运行 jUnit 测试时,我想阻止它运行。
@Scheduled(cron = "0 0 0 1 * ?")
public void SalesDataAggregation() {
//aggregation
}
Run Code Online (Sandbox Code Playgroud)
编辑
上面的方法也在这里被调用
@PostConstruct
public void init(){
SalesDataAggregation();
}
Run Code Online (Sandbox Code Playgroud) 我有一个xhtml页面,在其中我使用存储在辅助bean中的信息.但是我需要在xhtml使用之前在bean构造中做一些操作.该操作包括从数据库中检索数据.
然后我使用一个方法进行此操作,并将其命名为search
@PostConstruct并对其进行注释.但是当我调用我的xhtml页面时,我得到以下异常:
type Exception report
message An error occurred performing resource injection on managed bean MemberSearchControler
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: An error occurred performing resource injection on managed bean MemberSearchControler
javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
root cause
com.sun.faces.mgbean.ManagedBeanCreationException: An error occurred performing resource injection on managed bean MemberSearchControler
com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:227)
com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:103)
com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:69)
org.apache.el.parser.AstValue.getValue(AstValue.java:112)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
javax.faces.component.UIData.getValue(UIData.java:732)
javax.faces.component.UIData.getDataModel(UIData.java:1811)
javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
javax.faces.component.UIData.setRowIndex(UIData.java:473)
com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:82)
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:864)
javax.faces.component.UIData.encodeBegin(UIData.java:1133)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1894) …
Run Code Online (Sandbox Code Playgroud) 我有一个类Banana
,其中有一个@PostConstruct
我想在创建类对象后运行的方法。我正在使用这些调用创建此类的对象
Cat cat = new Cat();
Banana b = new Banana(cat);
Run Code Online (Sandbox Code Playgroud)
因此,从日志中我了解到创建对象@PostConstruct
时不会调用此方法。Banana
我认为我的实现方式不是正确的用法。有人可以指导我如何正确实现这一点,因为这是我使用 Spring Boot 在 Java 项目上的第一个任务。我需要在创建对象后运行该设置代码Banana
,那么除了@PostConstruct
@Slf4j
public class Banana {
public Banana(Cat cat) {
this.cat = cat;
}
private Cat cat;
@PostConstruct
public void setup() {
// some code
}
public void execute() {
// some code
}
}
Run Code Online (Sandbox Code Playgroud) java ×6
jsf ×3
spring ×3
spring-boot ×2
annotations ×1
cdi ×1
ejb ×1
facelets ×1
jpa ×1
jsf-2 ×1
junit4 ×1
managed-bean ×1
scope ×1
startup ×1