JSF ViewScoped bean не полностью создан - PullRequest
0 голосов
/ 04 мая 2019

У меня есть простая страница 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?

...