JSF: пустая вложенная таблица данных - PullRequest
2 голосов
/ 19 марта 2012

Я пишу свою собственную реализацию консоли JMX для JBoss 6.1 на основе JSF.

Часть кода управляемого компонента:

@ManagedBean
@SessionScoped
public class InspectionBean implements Serializable {
    private MBeanInfo data; 
    private List<OperationWrapper> operations;

    public void setInitData(MBeanInfo data) {
        this.data = data;   
        initOperations();
    }

    public List<MBeanOperation> getOperations() {
        return operations;
    }

    public void setOperations(List<MBeanOperation> list) {
        operations = list;
    }

    private void initOperations() {
        operations = new ArrayList<MBeanOperation>();

        for (MBeanOperationInfo opInfo : data.getOperations()) {
            OperationWrapper opWrapper = new OperationWrapper();

            opWrapper.setName(opInfo.getName());
            opWrapper.setDescription(opInfo.getDescription());
            opWrapper.setReturnType(opInfo.getReturnType());

            List<ParameterWrapper> paramList = 
                    new ArrayList<ParameterWrapper>(); 

            for (MBeanParameterInfo paramInfo : opInfo.getSignature()) {
                ParameterWrapper paramWrapper = 
                        new ParameterWrapper();

                paramWrapper.setName(paramInfo.getName());
                paramWrapper.setDescription(paramInfo.getDescription());
                paramWrapper.setType(paramInfo.getType());
                paramWrapper.setValue("");

                paramList.add(paramWrapper);
            }

            mBeanOp.setSignature(paramList);

            operations.add(mBeanOp);
        }
    }

    //some other code
}

Код класса OperationWrapper:

public class OperationWrapper implements Serializable {
    private String name;
    private String returnType;
    private List<ParameterWrapper> signature; 
    private String description;

    //other getters and setters

    public List<ParameterWrapper> getSignature() {
        return signature;
    }

    public void setSignature(List<ParameterWrapper> signature) {
        this.signature = signature;
    }   
}

Код класса ParameterWrapper:

public class ParameterWrapper implements Serializable {
    private String name;
    private String type;
    private String description;
    private String value;

    //simple getters and setters
}

А это код проблемной страницы:

<h:dataTable value="#{inspectionBean.operations}" var="operation"
        border="1" width="100%" cellpadding="5"
        style="border-style: solid; border-collapse: collapse;">
    <h:column>
        <f:facet name="header">Operation</f:facet>
        #{operation.name}
    </h:column>

    <h:column>
        <f:facet name="header">Return Value</f:facet>
        #{operation.returnType}
    </h:column>

    <h:column>
        <f:facet name="header">Description</f:facet>
        #{operation.description}
    </h:column>

    <h:column>
        <f:facet name="header">Parameters</f:facet>

        <h:form>
            <h:dataTable value="#{operation.signature}" var="param"
                    rendered="#{not empty operation.signature}"
                    border="1" width="100%"
                    style="border-style: solid; border-collapse: collapse;">
                <h:column>
                    #{param.name}
                </h:column>

                <h:column>
                    #{param.type}
                </h:column>

                <h:column>
                    #{param.description}
                </h:column>

                <h:column>
                    <h:inputText value="#{param.value}" size="20"/>
                </h:column>
            </h:dataTable>

            <a4j:commandButton value="Invoke" 
                    action="#{inspectionBean.invokeOperation(operation)}" 
                    render="@none"/>
        </h:form>
    </h:column>  
</h:dataTable>

Когда отображается эта часть страницы, это выглядит так: Example page То есть во вложенных таблицах данных нет текста!

Как видите, таблицы находятся там, где и должны.И есть ячейки для текста.И в нужном количестве.Но где текст?

Отладка не дает результата.Списки заполнены правильными данными.

Что не так?Как я могу это исправить?

1 Ответ

4 голосов
/ 19 марта 2012

Преступник находится в атрибуте var разметки вашей вложенной таблицы:

<h:dataTable value="#{operation.signature}" var="param" ...>
    <h:column>
        #{param.name}
    </h:column>
    ...

#{param} - это зарезервированное имя переменной EL, которое ссылается на карту параметров запроса, полученную с помощью ExternalContext#getRequestParameterMap(). Например. page.xhtml?id=123 выдаст печать 123 при использовании #{param.id}. Вы можете и не должны отменять это.

Дайте ему другое имя. Например. var="signature" и #{signature.name} и т. Д.

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...