У меня была проблема, которую я решил, но я чувствую, что мое решение - плохой взлом.Есть ли лучший способ?
У меня есть страница, на которой я разместил форму, которая показывает свойства какого-то объекта, как в примере (очевидные детали опущены).
Ticket.java:
@Entity
public class Ticket {
@Id
private Long id;
private String title;
private byte priority;
// Getters, setters...
}
TicketController.java
@RequestScoped
public class TicketController {
private Ticket ticket = new Ticket();
// Getters, setters...
public String doUpdateTicket() {
Ticket t = ticketEJB.getTicketById(ticket.getId());
t.setTitle(ticket.getTitle());
t.setPriority(ticket.getPriority());
ticketEJB.updateTicket(t);
ticket = t;
return "view.faces";
}
}
edit.xhtml (только форма, все остальное - шаблон)
<h:form>
<h:inputHidden value="#{ticketController.ticket.id}" />
<h:panelGrid columns="2">
<h:outputLabel value="ID"/>
<h:outputLabel value="#{ticketController.ticket.id}"/>
<h:outputLabel value="Title: "/>
<h:inputText value="#{ticketController.ticket.title}"/>
<h:outputLabel value="Priority: "/>
<h:inputText value="#{ticketController.ticket.priority}" />
<h:commandButton value="Submit"
action="#{ticketController.doUpdateTicket}" />
</h:panelGrid>
</h:form>
Также есть TicketEJB, которыйотвечает за выборку этих заявок, сохранение и т. д.
Поэтому я создаю скрытый ввод в форме, затем (в управляемом компоненте) нахожу заявку, используя предоставленный идентификатор, затем вручную копирую все поля из ticket
объект управляемого бина в извлеченный тикет, затем сохранить его ... Это связано с нарушением принципа СУХОЙ (я уже наткнулся на ошибку, когда добавил поле в тикет, но забыл скопировать его в doUpdateTicket()
.
Так, может быть, есть лучший способ сделать это?