Valores POST no recibidos por el servidor: marco de reproducción y extjs

Estoy creando un servicio web con playframework 2 y extjs4. Hasta el día de hoy he logrado superar cualquier obstáculo. Pero esto es algo con lo que no puedo lidiar solo. Seguí tutoriales, pero no me ayudó. Bueno, al principio lo hizo. Sé que funcionó, pude agregar algunos valores a la base de datos (mongodb). Dudo que sea importante, pero:

  • todo funcionó bien, agregué algunos datos de prueba en db
  • Escribí algunos otros métodos en Java.
  • solía db.Category.remove() en mi colección mongo
  • el servidor no puede recibir ningún valor del formulario ahora

Tengo un Ext.FormPanel con 2 campos:

items: [
    { 
        id: 'categoryName',
        fieldLabel: 'Category name', 
        name: 'categoryName', 
        allowBlank: false 
    },{
        xtype: 'textarea',
        id: 'categoryDescription',
        fieldLabel: 'Description',
        name: 'categoryDescription',
        allowBlank: true
    }
]

Correspondiente Model la clase se ve así:

@MongoCollection(name = "Category")
public class CategoryModel{
    private String categoryName;
    private String categoryDescription;

    @JsonProperty("categoryName")
    public String getName() {
        return categoryName;
    }

    @JsonProperty("categoryName")
    public void setName(String name) {
        this.categoryName = name;
    }

    @JsonProperty("categoryDescription")
    public String getDescription() {
        return categoryDescription;
    }

    @JsonProperty("categoryDescription")
    public void setDescription(String description) {
        this.categoryDescription = description;
    }

    public String toString(){
        ObjectMapper mapper = new ObjectMapper();
        String json = null;
        try {
            json = mapper.writeValueAsString(this);
        } catch (JsonGenerationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return json;
    }
}

Y finalmente, aquí es donde quiero recibir valores:

Form<CategoryModel> categoryForm = form(CategoryModel.class);
System.out.println(categoryForm);

Salida desde la consola Play:

Form(of=class kunto.models.CategoryModel, data={}, value=None, errors={})

Firebug muestra que los valores POST se envían correctamente:

categoryDescription test
categoryName    test

Y yo tengo POST tipo de solicitud en conf/routes definido en el lado del servidor para esta solicitud en particular.

Tengo preguntas 2:

  • que hacer para arreglarlo?
  • más importante, ¿por qué sucedió?

EDITAR Como sugirió @adis:

Form<CategoryModel> categoryForm = form(CategoryModel.class).bindFromRequest();
System.out.println(categoryForm);
System.out.println(categoryForm.data());

salidas:

Form(of=class kunto.models.CategoryModel, data={categoryName=test, categoryDescription=test}, value=Some({"categoryName":null,"categoryDescription":null}), errors={})
{categoryName=test, categoryDescription=test}

También revisé

CategoryModel categoryModel = form(CategoryModel.class).bindFromRequest().get();
System.out.println(categoryModel);

produce: {"categoryName":null,"categoryDescription":null}

¿Alguien puede explicar esto?

preguntado el 03 de mayo de 12 a las 18:05

Puedes probar: Formulario categoryForm = form(CategoryModel.class).bindFromRequest(); -

@adis gracias a su comentario, puedo ver el progreso: edité mi pregunta con una pequeña actualización:

¿Podría ser que el método toString() sea incorrecto? Cuando imprime un objeto, Java siempre llama al método toString(), ¿verdad? ¿Puede eliminar su método toString() y, en lugar de imprimir, simplemente depurarlo con eclipse? -

2 Respuestas

Como se comentó, debe vincular la solicitud a un modelo mediante:

 Form<CategoryModel> categoryForm = form(CategoryModel.class).bindFromRequest();

Esto le permitirá también verificar las propiedades en su modelo si las ha definido, como: @Contraints.Required.

Después del enlace, obtienes el objeto de formulario y get la instancia del modelo:

CategoryModel newCatModel = categoryForm.get();

Esto debería darle una instancia de su modelo con los datos de su solicitud de publicación. Por lo general, este método se parece a:

Form<Task> taskForm = form(Task.class).bindFromRequest();

if (taskForm.hasErrors()) {  // check for constraints
    Logger.info("Error:" + taskForm);
    return badRequest(views.html.task.create.render(taskForm));
}
// here get the model instance
Task newTask = taskForm.get();

Espero que esto ayude.

contestado el 03 de mayo de 12 a las 20:05

sobre nosotros @Required: play.lighthouseapp.com/projects/82401-play-20/tickets/313. Probaré tu solución en unos días, ¡gracias por la ayuda! - mayalitar

Los valores solo están vinculados si no hubo errores de validación. Entonces, si el correo electrónico está vacío, obtendrá un error de validación, por lo que no podrá usar el get() método. Esto no es un error, es solo la forma en que funciona. - leonard punt

Gracias por su ayuda, pero esto no resuelve mi problema, el efecto es el mismo. - mayalitar

No estoy seguro de lo que sucedió, pero el problema desapareció, ¡gracias por su ayuda! - mayalitar

Solo una suposición, pero ¿no debería anotar las propiedades en lugar de los captadores?

@JsonProperty("description")
public void setDescription(String description) {
    this.categoryDescription = description;
}

debiera ser

@JsonProperty("description")
private String description;

También tiene una discrepancia en su código anterior ... el captador de descripción está vinculado a "categoríaDescripción" mientras que el definidor está vinculado a "descripción"

contestado el 06 de mayo de 12 a las 11:05

Gracias por su respuesta, anotar propiedades en lugar de setters/getters no resolvió mi problema. desciption la anotación fue un error, lo vi antes en mi código, gracias por notarlo, todavía no era la fuente de mi problema. - mayalitar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.