我有两个关于两个注释的问题:
1)为什么" faceContext"必须从Resources类注入?相反,MemberController可以直接使用" FacesContext.getCurrentInstance()"在register()方法中使用FacesContext对象?这样做似乎要简单得多。
2)@ Model可以替换@Singlel吗?甚至是@ApplicationScoped?
感谢。
MemberController.java
@Model
public class MemberController {
@Inject
private FacesContext facesContext;
@Inject
private MemberRegistration memberRegistration;
@Produces
@Named
private Member newMember;
@PostConstruct
public void initNewMember() {
newMember = new Member();
}
public void register() throws Exception {
try {
memberRegistration.register(newMember);
FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_INFO, "Registered!", "Registration successful");
facesContext.addMessage(null, m);
initNewMember();
} catch (Exception e) {
String errorMessage = getRootErrorMessage(e);
FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, "Registration unsuccessful");
facesContext.addMessage(null, m);
}
}
}
Resources.java
public class Resources {
// use @SuppressWarnings to tell IDE to ignore warnings about field not being referenced directly
@SuppressWarnings("unused")
@Produces
@PersistenceContext
private EntityManager em;
@Produces
public Logger produceLog(InjectionPoint injectionPoint) {
return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
@Produces
@RequestScoped
public FacesContext produceFacesContext() {
return FacesContext.getCurrentInstance();
}
}
答案 0 :(得分:0)
注入FacesContext而不是使用静态工厂方法获取它具有以下优点:在实现生成器方法或字段时,您只需要关心如何获取当前上下文。每次你需要上下文时,你可以简单地注入它,它对你来说是完全透明的。当如何获得上下文的任何变化时,这也可能有一些好处,...
第二个问题的答案取决于您的要求。由于@Model只是@RequestScoped和@Named的刻板印象,因此您无法直接将其替换为@Singleton或@ApplicationScoped,因为这两个注释都是为了为所有请求创建单个对象的容器。然而,如果这比满足您的要求更好,而不是为每个请求设置不同的对象,您可以自由更改它;)