У меня есть простая страница JSF CRUD + bean-компонент с использованием DAO, как показано ниже:
<table>
<tr><td>Postname</td><td><h:inputText value="#{newsworks.newsletter.name}"></h:inputText></td></tr>
<tr><td>Author</td><td><h:inputText value="#{newsworks.newsletter.subject}"></h:inputText></td></tr>
<tr><td>Brief</td><td><h:inputText value="#{newsworks.newsletter.fromaddress}"></h:inputText></td></tr>
<tr style="display:none"><td>Postmessage(TXT)</td><td><h:inputTextarea rows="30" style="width:540px" value="#{newsworks.newsletter.emailtxtcontent}"></h:inputTextarea></td></tr>
<tr style="display:none"><td>Postmessage(HTML)</td><td><h:inputTextarea id="classic" rows="30" style="width:540px" value="#{newsworks.newsletter.emailhtmlcontent}"></h:inputTextarea></td></tr>
<tr>
<td></td>
<td>
<h:commandLink value="Submit" action="#{newsworks.submit()}" ></h:commandLink>
<h:commandLink value="Update" action="#{newsworks.update()}" ></h:commandLink>
</td>
</tr>
</table>
<table>
<thead>
<td>ID</td>
<td>Postname</td>
<td>Subject</td>
<td>From</td>
<td>Emailtype</td>
<td>Postmessage</td>
<td>Delete</td>
</thead>
<ui:repeat value="#{newsworks.newsletters}" var="pageitem">
<tr>
<td><h:outputText value="#{pageitem.name}"></h:outputText></td>
<td><h:outputText value="#{pageitem.subject}"></h:outputText></td>
<td><h:outputText value="#{pageitem.fromaddress}"></h:outputText></td>
<td><h:outputText value=""></h:outputText></td>
<td><h:outputText value=""></h:outputText></td>
<td>
<h:commandLink value="Delete" action="#{newsworks.delete(pageitem)}" ></h:commandLink>
<h:commandLink value="Edit" action="#{newsworks.select(pageitem)}" ></h:commandLink>
</td>
</tr>
</ui:repeat>
</table>
Соответствующая часть бина указана ниже:
@ManagedBean(name="newsworks")
@ViewScoped
public class NewsWorks implements Serializable {
private static final long serialVersionUID = 1L;
private static final String PERSISTENCE_UNIT_NAME = "rdb";
private static EntityManagerFactory factory;
public Newsletter newsLetter = new Newsletter();
@PostConstruct
public void getAllNewsletters() {
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();
Query qa = em.createNativeQuery("select * from Newsletter order by id asc ", model.Newsletter.class);
List<Newsletter> NewsletterList = (List<Newsletter>) qa.getResultList();
if(NewsletterList.isEmpty())
NewsletterList = new ArrayList<Newsletter>();
setNewsletters(NewsletterList);
}
public String select(Newsletter bp) {
setNewsletter(bp);
return null;
}
public String update() {
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();
Newsletter bp = newsLetter;
Newsletter bolocal = em.find(Newsletter.class, bp.getId());
em.getTransaction().begin();
bolocal.setId(bp.getId());
bolocal.setName(bp.getName());
bolocal.setSubject(bp.getSubject());
bolocal.setFromaddress(bp.getFromaddress());
bolocal.setSendgroup(bp.getSendgroup());
em.getTransaction().commit();
setNewsletter(new Newsletter());
getAllNewsletters();
return null;
}
public Newsletter newsLetter = new Newsletter();
public Newsletter getNewsletter() {
return newsLetter;
}
public void setNewsletter(Newsletter newslet) {
this.newsLetter = newslet;
}
public List<Newsletter> Newsletters = new ArrayList<Newsletter>();
public List<Newsletter> getNewsletters() {
return Newsletters;
}
public void setNewsletters(List<Newsletter> Newsletters) {
this.Newsletters = Newsletters;
}
.....
Когда вызывается метод select (), я получаю полностью сконструированный объект Newsletter, однако, когда метод update () вызывается, элемент-член newsLetter создается только частично (если быть точным, только члены, на которые есть ссылки в .xhtml) страница доступна, в то время как другие установлены в ноль, особенно 'id').
Мой вопрос, это связано с javax.faces.PARTIAL_STATE_SAVING? Я также играл с javax.faces.STATE_SAVING_METHOD (т. Е. Клиент и сервер), я перепробовал все варианты этих настроек и не могу заставить работать этот бит ViewScoped.
Может ли кто-нибудь обнаружить какие-либо явные проблемы с кодом или любые другие изменения, которые необходимо внести, чтобы полностью сохранить компонент ViewScoped?