Cuadrícula en Struts2 usando el complemento struts2-jquery-grid

Estoy intentando con una cuadrícula jutsue Struts usando elstruts2-jquery-grid-3.7.0 plugin como se demuestra en elescaparate, Cuadrícula (Editable / Multiselección).

La forma de Struts:

<s:form namespace="/admin_side" action="Test" validate="true" id="dataForm" name="dataForm">
    <s:url id="remoteurl" action="TestGrid" namespace="/admin_side"/>
    <s:url id="editurl" action="edit-grid-entry"/>
    <sjg:grid
        id="gridmultitable"
        caption="Example (Editable/Multiselect)"
        dataType="json"
        href="%{remoteurl}"
        pager="true"
        navigator="true"
        navigatorSearchOptions="{sopt:['eq','ne','lt','gt']}"
        navigatorAddOptions="{height:280, width:500, reloadAfterSubmit:true}"
        navigatorEditOptions="{height:280, width:500, reloadAfterSubmit:false}"
        navigatorEdit="true"
        navigatorView="true"
        navigatorViewOptions="{height:280, width:500}"
        navigatorDelete="true"
        navigatorDeleteOptions="{height:280, width:500,reloadAfterSubmit:true}"
        gridModel="gridModel"
        rowList="5,10,15"
        rowNum="5"
        rownumbers="true"
        editurl="%{editurl}"
        editinline="true"
        multiselect="true"
        onSelectRowTopics="rowselect"
        >

        <sjg:gridColumn name="countryId" index="countryId" title="Id" formatter="integer" editable="false" sortable="true" search="true" sorttype="integer" searchoptions="{sopt:['eq','ne','lt','gt']}"/>
        <sjg:gridColumn name="countryName" index="countryName" title="Country Name" editable="true" edittype="text" sortable="true" search="true" sorttype="text"/>
        <sjg:gridColumn name="countryCode" index="countryCode" title="Country Code" sortable="true" search="true" editable="true" sorttype="text"/>

    </sjg:grid>
</s:form>

La clase de acción:

@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "json-default")
@InterceptorRefs(@InterceptorRef(value = "store", params = {"operationMode", "AUTOMATIC"}))
public final class TestAction extends ActionSupport implements Serializable
{
    @Autowired
    private final transient CountryService countryService=null;
    private static final long serialVersionUID = 1L;
    // Result List
    private List<Country> gridModel;
    // Get how many rows we want to have into the grid - rowNum attribute in the grid
    private Integer rows=5;
    // Get the requested page. By default grid sets this to 1.
    private Integer page=1;
    // sorting order - asc or desc
    private String sord;
    // get index row - i.e. user click to sort.
    private String sidx;
    // Search Field
    private String searchField;
    // The Search String
    private String searchString;
    // The Search Operation ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc']
    private String searchOper;
    // Your Total Pages
    private Integer total;
    // All Records
    private Integer records;

    @Action(value = "TestGrid",
    results = {
        @Result(name = ActionSupport.SUCCESS, type = "json", params = {"includeProperties", "gridModel\\[\\d+\\]\\.countryId, gridModel\\[\\d+\\]\\.countryName, gridModel\\[\\d+\\]\\.countryCode", "excludeNullProperties", "true"})},
    interceptorRefs = {
        @InterceptorRef(value = "json")})
    public String execute() {
        records=countryService.rowCount().intValue();
        total=new BigDecimal(records).divide(new BigDecimal(rows), 0, BigDecimal.ROUND_CEILING).intValue();
        gridModel=countryService.getList(page, rows, null, null);

        System.out.println("records "+records+" total "+total+" Page " + getPage() + " Rows " + getRows() + " Sort Order " + getSord() + " Index Row :" + getSidx()+"Search :" + searchField + " " + searchOper + " " + searchString);
        return SUCCESS;
    }

    public String getJSON() {
        return execute();
    }

    public Integer getRows() {
        return rows;
    }

    public void setRows(Integer rows) {
        this.rows = rows;
    }

    public Integer getPage() {
        return page;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public Integer getTotal() {
        return total;
    }

    public void setTotal(Integer total) {
        this.total = total;
    }

    public Integer getRecords() {
        return records;
    }

    public void setRecords(Integer records) {
        this.records = records;            
    }

    public List<Country> getGridModel() {
        return gridModel;
    }

    public void setGridModel(List<Country> gridModel) {
        this.gridModel = gridModel;
    }

    public String getSord() {
        return sord;
    }

    public void setSord(String sord) {
        this.sord = sord;
    }

    public String getSidx() {
        return sidx;
    }

    public void setSidx(String sidx) {
        this.sidx = sidx;
    }

    public void setSearchField(String searchField) {
        this.searchField = searchField;
    }

    public void setSearchString(String searchString) {
        this.searchString = searchString;
    }

    public void setSearchOper(String searchOper) {
        this.searchOper = searchOper;
    }

    @Action(value = "Test",
    results = {
        @Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
        @Result(name = ActionSupport.INPUT, location = "Test.jsp")},
    interceptorRefs = {
        @InterceptorRef(value = "defaultStack", params = {"validation.validateAnnotatedMethodOnly", "true", "validation.excludeMethods", "load"})})
    public String load() throws Exception {
        return ActionSupport.SUCCESS;
    }
}

Los enlaces de paginación siguiente y anterior siempre están deshabilitados como se muestra ensiguiendo instantánea.

Esto indica,Página 1 de 1. No hay mas paginas. Por lo tanto, los enlaces están deshabilitados.

En elexecute() método, sin embargo,records se inicializa a31, total a7 Page a1 Rows a5. Todas las demás propiedades sonsiempre nulo si se hace clic en los enlaces / botones para ordenar, buscar, editar o agregar una fila.

¿Qué estoy pasando por alto aquí?

Respuestas a la pregunta(1)

Su respuesta a la pregunta