Jsf2嵌套数据表更新值

时间:2012-01-16 12:23:17

标签: java jsf-2 richfaces

我正在使用richfaces 4,我正在使用嵌套的rich:datatable。我的对象模型非常简单。我的形状有多个坐标(x和y)。

        <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>

Backing Bean(viewscped):

@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(...)工作正常,并从我的Shape中删除选定的坐标。

当我想从一个形状编辑一个坐标并点击安全时,我只能编辑最后一个形状。因此,编辑列表中最后一个形状的坐标会起作用,但对于所有其他形状都不起作用。

当我想让Coordinates可编辑时,是否有可能像我在这里构建或嵌套dataTables这样的问题?

最好的问候, 米

更新: 当我从rich:dataTable更改为h:dataTable时,它可以工作。也许富有的一个错误:dataTable?

更新2: 似乎它是Richfaces 4.0.0.Final中的一个错误。更新到4.1.0.Final时它可以工作。

0 个答案:

没有答案