Tôi gặp sự cố với ap: selectOneMenu, bất kể tôi làm gì, tôi không thể yêu cầu JSF gọi bộ định trên thực thể JPA. Xác thực JSF không thành công với thông báo này:
form: location: Validation Error: Giá trị không hợp lệ
Tôi có cái này hoạt động trên một số lớp khác cùng loại (tức là tham gia các lớp bảng) nhưng không thể cho cuộc đời tôi làm cho cái này hoạt động.
Nếu ai đó có thể đưa ra một số mẹo khắc phục sự cố / gỡ lỗi cho loại vấn đề này thì sẽ được đánh giá rất cao.
Sử dụng báo cáo nhật ký, tôi đã xác minh những điều sau:
- Trả
Conveter
vềnull
giá trị chính xác, không phải . - Tôi không có Xác thực Bean trong các thực thể JPA của mình.
- Người thiết lập
setLocation(Location location)
không bao giờ được gọi.
Đây là ví dụ đơn giản nhất tôi có thể làm và nó chỉ đơn giản là sẽ không hoạt động:
<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>
Người chuyển đổi:
@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());
}
}
Đầu ra bảng điều khiển:
// 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
kiểm tra này xảy ra. Tình hình của tôi hơi phức tạp. Tôi tạo thành phần tùy chỉnh của riêng mình cho phép người dùng có bố cục radio phức tạp. Nó hoạt động tốt nếu tôi chỉ có một nhóm radio (f: selectItems ngay bên dưới thành phần tùy chỉnh của tôi). Tuy nhiên khi bố cục trở nên phức tạp hơn (nhiều nhóm radio, mỗi nhóm có f: selectItems riêng nhưng tất cả đều chia sẻ cùng một lựa chọn), tôi phải có f: selectItems bên trong ui: repeat, thì ui: repeat nằm trong thành phần tùy chỉnh của tôi. Sau đó tôi gặp phải vấn đề này. Tôi muốn xem mã mojarra xử lý việc này