Я использую richfaces 4, и я использую вложенный rich: datatable. Моя объектная модель очень проста. У меня есть форма с несколькими координатами (х и у).
<rich:dataTable id="shapeTable" value="#{shapeListBean.shapes}" var="shape">
<rich:column>
<f:facet name="header">Id</f:facet>
#{shape.shapeId}
</rich:column>
<rich:column>
<f:facet name="header">Shape</f:facet>
<rich:dataTable value="#{shape.blockCoordinates}" var="coord">
<rich:column>
<h:outputLabel value="x" for="coordXId"/>
<h:inputText id="coordXId" value="#{coord.x}" />
</rich:column>
<rich:column>
<h:outputLabel value="y" for="coordYId"/>
<h:inputText id="coordYId" value="#{coord.y}" />
</rich:column>
<rich:column>
<a4j:commandButton value="#{bundle.remove}" action="#{shapeListBean.removeCoord(shape, coord)}" render="shapeTable messages"/>
</rich:column>
</rich:dataTable>
<h:commandButton value="#{bundle.save}" action="#{shapeListBean.update(shape)}" render="shapeTable messages"/>
</rich:column>
</rich:dataTable>
бэк (видоискатель):
@ManagedBean
@ViewScoped
public class ShapeListBean implements Serializable {
public ShapeListBean() {}
@PostConstruct
public void init(){
log.debug("Init ShapeListBean ...");
shapes = shapeService.listShapes();
log.debug("Shape Count: " + shapes.size());
// Adding a starting coordinate
coords.add(new Coordinate());
}
public void removeCoord(Shape shape, Coordinate coord){
log.debug("Removing coordinate from shape: " + shape.getShapeId() + " " + coord);
shape.getInitBlockCoord().remove(coord);
}
public void update(Shape shape){
try{
log.debug("Update shape: " + shape.getShapeId());
shapeService.updateShape(shape.getShapeId(), shape.getInitBlockCoord());
}catch(Exception ex){
Core.setFacesMessage(ex, userBean.getLanguage(), HqException.INTERNAL_ERROR);
}
}
Форма:
public class Shape implements Serializable{
private static final long serialVersionUID = -2230775000488531609L;
@Id
private String shapeId = java.util.UUID.randomUUID().toString();
@ElementCollection(fetch=FetchType.EAGER)
private Set<Coordinate> initBlockCoord = new HashSet<Coordinate>();
Координация:
@Embeddable
public class Coordinate implements Serializable, ICoordinate{
private static final long serialVersionUID = -5866341829302555966L;
@Column(nullable=true)
protected int x;
@Column(nullable=true)
protected int y;
shapeListBean.remove (...) работает нормально и удаляет выбранные координаты из моей фигуры.
Когда я хочу отредактировать одну координату из фигуры и нажать «безопасно», я могу редактировать только последнюю форму. Таким образом, редактирование координат последней фигуры в списке работает, но не выполняется для всех других фигур.
Можно ли сделать что-то вроде того, что я строю здесь, или если вложенные данные таблицы являются проблемой, когда я хочу сделать координаты редактируемыми?
С наилучшими пожеланиями,
м
UPDATE:
Когда я перехожу с rich: dataTable на h: dataTable, это работает. Может быть, ошибка в rich: dataTable?
ОБНОВЛЕНИЕ 2:
Кажется, это ошибка в Richfaces 4.0.0.Final. При обновлении до 4.1.0. Финал работает.