Jsf2 вложенные датированные значения обновления - PullRequest
0 голосов
/ 16 января 2012

Я использую 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. Финал работает.

...