Я сейчас в процессе преобразования приложения примера Virtual Trainer из учебника Ed Burns на JSF 2.0 из JSF Managed Beans в CDI. Большинство проблем, с которыми я столкнулся до сих пор, были связаны с определением области охвата и забыванием правильно вводить, но теперь я изо всех сил пытаюсь преодолеть последнее препятствие, связанное с извлечением CDI Bean (фактически класса сущности) из RequestMap. Из того, что я смог выяснить до сих пор, оказалось, что управляемый компонент, обработанный запросами, может быть извлечен очень просто, используя метод шаблона .get (String managedbeanname), предоставляемый реализацией карты. Однако, с CDI, bean-файл обернут Weld в экземпляре CreationalContextImp, и я не могу извлечь объект, который действительно есть, даже если он подтвердил, что он присутствует в RequestMap. Я могу получить вкратце доступ к прокси-объекту из RequestMap, но после обращения к .get («пользователь») он возвращается к нулевому значению, и я сомневаюсь, что это все равно принесет пользу, так как поля в прокси-сервере все обнуляются.Извлечь RequestScoped CDI bean из RequestMap
Я нашел сообщение от BalusC, в котором обсуждается использование класса фильтра для доступа к CDI-компонентам, хранящимся в SessionScope (How do I get a SessionScoped CDI bean from inside a Filter?). Кажется, это немного связано - есть ли более простое решение? Я также очень понимаю, что я, возможно, собираюсь обсуждать/смешивать стратегии Managed Bean vs CDI, поэтому не стесняйтесь устанавливать меня прямо ... Я также немного не понимаю, как использовать Entity Bean прямо таким образом, а не использовать Фасад. Является ли это причиной меня/может вызвать у меня проблему позже?
Окружающая среда: JEE7, Glassfish 4, Netbeans 7.4, Maven EE Archetype Исходный код, связанный с использованием управляемых компонентов, был закомментирован.
Абстрактный класс подложки боб:
@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();
}
Страница регистрации поддержка боб:
@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;
}
объект пользователя боб:
@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>
В следующий раз предоставить меньше информации. Например, ваша организация не связана с вопросом. В центре внимания то, что вы хотите решить. –
Понял - я думаю, если кому-то нужна дополнительная информация, они могли бы спросить – rustproofFish