Я использую JSF в течение нескольких месяцев.У моего bean Person много полей (около 50) и несколько суббинов (4 адреса, 2 контакта ..): связанная форма большая и управляется с помощью некоторых действий ajax.Я бы использовал эту форму для «нового» Person, а также для «edit» Person.
После Создание страниц с основными данными для сущностей, как их связать и какую область действия бина выбрать сейчасУ меня есть форма для person.xhtml, страница поиска search_p.xhtml , где я выбираю Person и захожу на edit_person.xhtml .
search_p.xhtml имеет списокПерсона, у каждого человека есть эта ссылка
<h:link value="Open" outcome="person">
<f:param name="id_p" value="#{person.id}"/>
</h:link>
person.xhtml содержит
<f:metadata>
<f:viewParam name="id_p" value="#{editPerson.person}"
converter="#{personConverter}"
converterMessage="Person unknown, please use a link from within the system."
required="true" requiredMessage="Bad request, please use a link from within the system." />
</f:metadata>
PersonConverter имеет
@ManagedBean
@RequestScoped
public class PersonConverter implements Converter {
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || value.isEmpty()) return null;
try {
if(value.equals("new")) return new Person(); //used for link to new
else {
Integer id = Integer.valueOf(value);
return PersonDAO.getById(id.intValue());
}
} catch (NumberFormatException e) { throw new ConverterException("Not valid Person ID: " + value, e); }
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null) return "";
if (value instanceof Ordine) {
Integer id = ((Ordine) value).getId();
return (id != null) ? String.valueOf(id.intValue()) : null;
} else {
throw new ConverterException("Not valid Person ID: " + value);}
}
}
side_menu.xhtml является частью шаблона, здесьон вызывает "New Person"
<li><h:link value="New" outcome="person">
<f:param name="id_p" value="new" />
</h:link></li>
Bean-компонент EditPerson равен
@ManagedBean
@ViewScoped
public class EditPerson implements Serializable {
private static final long serialVersionUID = 1768587713177545840L;
private Person person;
public Person getPerson() {return person;}
public void setPerson(Person person) {this.person = person;}
public String save() {
PersonDAO.addOrUpdate(person);
return "/search_p?faces-redirect=true";
}
Итак, когда в person.xhtml я нажимаю
Contact 2
<h:selectBooleanCheckbox value="#{editPerson.person.enable_c2}" id="flag_c2">
<f:ajax event="click" execute="flag_c2" render="div_c2"></f:ajax>
</h:selectBooleanCheckbox>
, появляется всплывающее окно: serverError: класс javax.faces.component.UpdateModelException /include/person/tab_anag.xhtml @ 372,26 value = "# {editPerson.person.enable_f2}": цель недостижима, «персона» вернула ноль .PersonConverter был запущен, я полагаю, потому что f: метаданные в коде страницы: могу ли я избежать вызова PersonConverter, когда запущен ajax?Мне нужно f: метаданные только для передачи идентификатора со страницы search_p.