私は現在、Ed Burns の JSF 2.0 に関する教科書の Virtual Trainer サンプル アプリを JSF Managed Beans から CDI に変換中です。これまでに遭遇した問題のほとんどは、スコーピングと正しく注入するのを忘れることに関連していましたが、現在、RequestMap から CDI Bean (実際にはエンティティ クラス) を抽出することに関連する最新のハードルを克服するのに苦労しています。これまでに確認できたことから、リクエスト スコープのマネージド Bean は、Map 実装によって提供されるボイラープレート .get(String managedbeanname) メソッドを使用して非常に簡単に抽出できるようです。ただし、CDI を使用すると、Bean は CreationalContextImp インスタンスで Weld によってラップされ、RequestMap に存在することを確認したにもかかわらず、実際に求めているオブジェクトを抽出できません。
フィルター クラスを使用して、SessionScope に保持されている CDI Bean にアクセスする方法について説明している BalusC からの投稿を見つけました (フィルター内から SessionScoped CDI Bean を取得するにはどうすればよいですか? )。また、Managed Bean と CDI 戦略のスコーピング/ミキシングを台無しにしている可能性があることも十分承知しているので、自由に説明してください。ファサード。これにより、後で問題が発生する可能性がありますか?
環境: JEE7、Glassfish 4、Netbeans 7.4、Maven EE Web Archetype マネージド Bean の使用に関連する元のコードはコメント アウトされています。
抽象バッキング Bean クラス:
@RequestScoped
public abstract class AbstractBacking implements Serializable {
//@ManagedProperty(value="#{facesContext}")
private FacesContext facesContext;
//@ManagedProperty(value="#{requestScope}")
private Map<String, Object> requestMap;
//@ManagedProperty(value="#{sessionScope}")
private Map<String, Object> sessionMap;
@PostConstruct
public void init() {
this.facesContext = FacesContext.getCurrentInstance();
this.sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
this.requestMap = FacesContext.getCurrentInstance().getExternalContext().getRequestMap();
}
登録ページ バッキング Bean:
@Named
@RequestScoped
public class RegisterBacking extends AbstractBacking implements Serializable {
private Object password1;
@Inject
private User newUser;
public String registerUser() {
String result = null;
User newUser = (User) getRequestMap().get("user");
// set the password into the user, because we know the validator was
// successful if we reached here.
newUser.setPassword((String) getRequestMap().get("password1"));
try {
UserRegistry.getCurrentInstance().addUser(newUser);
// Put the current user in the session
setCurrentUser(newUser);
// redirect to the main page
result = "/user/allEvents?faces-redirect=true";
} catch (EntityAccessorException ex) {
getFacesContext().addMessage(null,
new FacesMessage("Error when adding user"
+ ((null != newUser) ? " " + newUser.toString() : "") + "."));
}
return result;
}
ユーザー エンティティ Bean:
@Entity
@Named
@Table(name = "Users")
@RequestScoped
@NamedQueries({
@NamedQuery(name = "user.getAll", query = "select u from User as u"), // @NamedQuery(name = "user.getTrainers", query = "select u from User as u where u.trainer = TRUE"),
// @NamedQuery(name = "user.getUsersForTrainerId", query = "select u from User as u where u.personalTrainerId = :theId")
})
public class User extends AbstractEntity implements Serializable {
protected String firstName;
protected String lastName;
@Temporal(TemporalType.DATE)
protected Date dob;
protected String sex;
protected String email;
private String serviceLevel = "medium";
@Column(name = "userid", nullable = false)
private String userid;
private String password;
private boolean trainer;
private List<Long> subscribedEventIds;
private Long personalTrainerId;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<TrainingSession> sessions;
private boolean sessionsInitialized = false;
public User() {
this.init();
}
public User(String firstName, String lastName,
String sex, Date dob, String email, String serviceLevel,
String userid, String password, boolean isTrainer) {
this.init();
this.setFirstName(firstName);
this.setLastName(lastName);
this.setSex(sex);
this.setDob(dob);
this.setEmail(email);
this.setServiceLevel(serviceLevel);
this.setUserid(userid);
this.setPassword(password);
this.setTrainer(isTrainer);
}
.....
Getters/setters/etc
.....
登録ページ:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<body>
<ui:composition template="template.xhtml">
<ui:define name="content">
<h:form prependId="false">
<h:panelGrid columns="3">
<h:outputLabel for="fname" value="First Name:" />
<h:inputText label="First Name"
id="fname" value="#{user.firstName}"
required="true"/>
<h:message for="fname" />
<h:outputLabel for="lname" value="Last Name:" />
<h:inputText label="Last Name"
id="lname" value="#{user.lastName}"
required="true"/>
<h:message for="lname" />
<h:outputLabel for="sex" value="Sex:" />
<h:selectOneRadio label="Sex"
id="sex" value="#{user.sex}" required="true">
<f:selectItem itemLabel="Male" itemValue="male" />
<f:selectItem itemLabel="Female" itemValue="female" />
</h:selectOneRadio>
<h:message for="sex" />
<h:outputLabel for="dob" value="Date of Birth:" />
<h:panelGroup>
<h:inputText label="Date of Birth"
id="dob" value="#{user.dob}" required="true">
<f:convertDateTime pattern="MM-dd-yy" />
</h:inputText> (mm-dd-yy)
</h:panelGroup>
<h:message for="dob" />
<h:outputLabel for="email" value="Email Address:" />
<h:inputText label="Email Address"
id="email" value="#{user.email}" required="true" />
<h:message for="email" />
<h:outputLabel for="slevel" value="Service Level:" />
<h:selectOneMenu label="Service Level" id="slevel"
value="#{user.serviceLevel}">
<f:selectItem itemLabel="Medium" itemValue="medium" />
<f:selectItem itemLabel="Basic" itemValue="basic" />
<f:selectItem itemLabel="Premium" itemValue="premium" />
</h:selectOneMenu>
<h:message for="slevel" />
<h:outputLabel for="userid" value="Userid:" />
<h:inputText required="true" id="userid" value="#{user.userid}" />
<h:message for="userid" />
<h:outputLabel for="password" value="Password:" />
<h:inputSecret required="true" id="password"
validator="#{registerBacking.validatePassword1}"
value="#{requestScope.password1}" />
<h:message for="password" />
<h:outputLabel for="password2" value="Retype Password:" />
<h:inputSecret required="true" id="password2" value="#{requestScope.password2}"
validator="#{registerBacking.validatePassword2}" />
<h:message for="password2" />
</h:panelGrid>
<p><h:commandButton value="Register"
action="#{registerBacking.registerUser}" /></p>
</h:form>
</ui:define>
</ui:composition>
</body>
</html>