style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Richface Problema : <a4j: ActionParam>??

Hola, estoy aprendiendo RichFace, con ayuda del libro "Practical RichFace " y tengo un contratiempo.

Resulta que en este ejemplo, al apretar sobre uno de los enlaces aumenta el valor del campo (unico en la fila) y al apretar el otro lo disminuye(en 1).
[0 ][+ / - ]
[0 ][+ / - ]
[0 ][+ / - ]
[0 ][+ / - ]

Pero , ambas etiqueta action param,aparentemente no estan enviando el valor, y me aparece un nullpointerexcepcion cada vez trato de hacer un cambio en la tabla.
E ingresado un valor directamente sobre el bean, y me funciona correctamente, lo que me lleva a pensar que en los action param algo esta errado o talvez el rowkeyvar.

Este es el código, espero puedan ayudarme.

 
    <h:form>
        <rich:panel style="width:150px">
                <f:facet name="header">
                        Using a4j:repeat
                </f:facet>
        <table>
                        <a4j:repeat value="#{repeatBean.numbers }" var="rec"
                                rowKeyVar="rowIndex"
                              ajaxKeys="#{repeatBean.rowsToUpdate}">
                        <tr>
                                <td width="20px">
                                <h:outputText id="num" value="#{rec.number}" />
                                </td>
                                       
                                <td>
                                        <a4j:commandLink value="-" reRender="num"
                                        actionListener="#{repeatBean.decrease}">
                                                <a4j:actionparam name="rowIndex"
                                                        value="#{rowIndex}"
                                        assignTo="#{repeatBean.updatedRow}" />
                                        </a4j:commandLink>
                               
                                /
                               
                                        <a4j:commandLink value="+" reRender="num"
                                        actionListener="#{repeatBean.increase}">
                                                <a4j:actionparam name="rowIndex"
                                                 value="#{rowIndex}"
                                        assignTo="#{repeatBean.updatedRow}" />
                                        </a4j:commandLink>
                                </td>
                        </tr>
                        </a4j:repeat>
                </table>
        </rich:panel>
/h:form>

 

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.faces.event.ActionEvent;

public class RepeatBean {

private List numbers;
private Set rowsToUpdate;
private Integer updatedRow;

public RepeatBean() {
}

public void increase (ActionEvent event){
rowsToUpdate.clear();
// increase selected number

numbers.get(updatedRow).increase();
//numbers.get(updatedRow).increase();
// insert row to be updated
rowsToUpdate.add(updatedRow);
}

public void decrease (ActionEvent event){
rowsToUpdate.clear();
// decrease selected number
numbers.get(updatedRow).decrease();
// insert row to be updated
rowsToUpdate.add(updatedRow); }

// init method
@PostConstruct
public void init () {
// list of numbers
numbers = new ArrayList ();
// Set to hold rows to be updated
rowsToUpdate = new HashSet ();
numbers.add(new MagicNumber());
numbers.add(new MagicNumber());
numbers.add(new MagicNumber());
numbers.add(new MagicNumber());
numbers.add(new MagicNumber());
}

public Set getRowsToUpdate() {
return rowsToUpdate;
}

public void setUpdatedRow(Integer updatedRow) {
this.updatedRow = updatedRow;
}

public Integer getUpdatedRow() {
return updatedRow;
}

public void setNumbers(List numbers) {
this.numbers = numbers;
}

public List getNumbers() {
return numbers;
}
}

public class MagicNumber {

private Integer number;

public void increase (){
setNumber(getNumber() + 1);
}

public void decrease () {
setNumber(getNumber() - 1);
}

public MagicNumber (){
number = 0;
}

public void setNumber(Integer number) {
this.number = number;
}

public Integer getNumber() {
return number;
}

}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de benek

ActionListener y ActionParam

¿Qué versión de Richfaces tienes?

Recuerdo que hasta cierta versión de Richfaces (me parece que 3.2.x, no estoy seguro) la instrucción de a4j:actionParam era llamada antes que el atributo actionListener de tu a4j:commandLink (o Button), pero a partir de 3.3.0 actionListener se ejecutaba primero (para ser coherente con la especificación de JSF 1.2). Este detalle puede ser el detonador de tu NPE, ya que estarías accediendo desde repeatBean.decrease la propiedad updatedRow que aún no es asignada.

Posibles soluciones:

  • La etiqueta a4j:actionParam tiene dentro de sí misma su atributo actionListener, prueba poniendo ahí tu llamada a repeatBean.decrease en lugar de hacerlo en el actionListener del a4j:commandLink.
  • Prueba envolver el a4j:actionParam dentro de un a4j:support con event="onclick".
  • También podrías utilizar f:setPropertyActionListener, aunque éste no es de Richfaces.

Ya nos cuentas.

*Edit: Por cierto, es "Richfaces", no "Richface". ;-)

Saludos.

Imagen de gallark

Me asombra el nivel de

Me asombra el nivel de seguimiento que hay que hacerle a las versiones, este detalle no me lo esperaba, a funcionado muy bien la primera opción.

Precisamente en este libro trabajan con la versión 3.2.x, te agradezco el apoyo.
Si tienes algunos tips para aprender mejor este Framework estaré atento.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">