У мене проблема з ap: selectOneMenu, незалежно від того, що я роблю, я не можу змусити JSF викликати сеттера в сутності JPA. Не вдається перевірити JSF із цим повідомленням:
form: location: Помилка перевірки: Значення недійсне
Я працюю над кількома іншими класами того ж типу (тобто, приєднуюсь до класів таблиць), але не можу протягом усього життя змусити цей працювати.
Якщо хтось може підказати деякі поради щодо усунення несправностей / налагодження для такого роду проблем, це буде вдячне.
За допомогою операторів журналу я перевірив наступне:
Conveter
Повертаюся правильно, що не єnull
значення.- У моїх організаціях JPA немає перевірки Bean.
- Сеттера
setLocation(Location location)
ніколи не викликають.
Це найпростіший приклад, який я можу зробити, і він просто не буде працювати:
<h:body>
<h:form id="form">
<p:messages id="messages" autoUpdate="true" />
<p:selectOneMenu id="location" value="#{locationStockList.selected.location}" converter="locationConverter">
<p:ajax event="change" update=":form:lblLocation"/>
<f:selectItems value="#{locationStockList.locationSelection}"/>
</p:selectOneMenu>
</h:form>
</h:body>
Перетворювач:
@FacesConverter(forClass=Location.class, value="locationConverter")
public class LocationConverter implements Converter, Serializable {
private static final Logger logger = Logger.getLogger(LocationConverter.class.getName());
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value.isEmpty())
return null;
try {
Long id = Long.parseLong(value);
Location location = ((LocationManagedBean) context.getApplication().getELResolver().getValue(context.getELContext(), null, "location")).find(id);
logger.log(Level.SEVERE, "Converted {0} to {1}" , new Object[] {value, location});
return location;
} catch (NumberFormatException e) {
return new Location();
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null || value.toString().isEmpty() || !(value instanceof Location))
return "";
return String.valueOf(((Location) value).getId());
}
}
Вихід консолі:
// Getter method
INFO: Current value=ejb.locations.Location[id=null, name=null, latitude=0.0, longitude=0.0]
// Session Bean
INFO: Finding ejb.locations.Location with id=3
// Session Bean
INFO: ### Returning : ejb.locations.Location[id=3, name=mdmd, latitude=4.5, longitude=2.3]
// Converter
SEVERE: Converted 3 to ejb.locations.Location[id=3, name=mdmd, latitude=4.5, longitude=2.3]
// Getter method -> Where did my selected Location go ??
INFO: Current value=ejb.locations.Location[id=null, name=null, latitude=0.0, longitude=0.0]
equals
відбувається ця перевірка. Моя ситуація дещо складна. Я створюю власний власний компонент, який дозволяє користувачеві мати складний макет радіо. Це прекрасно працює, якщо у мене є лише одна група радіо (f: selectItems прямо під моїм користувацьким компонентом). Однак, оскільки макет стає більш складним (кілька радіогруп, кожна має свої власні f: selectItems, але всі мають однаковий вибір), я повинен мати f: selectItems всередині ui: repeat, тоді ui: repeat знаходиться під моїм користувацьким компонентом. Потім я зіткнувся з цим питанням. Я хочу побачити код моджарри, який це обробляє