(Vraptor-Extjs4) Operaçao com varios registros

5 respostas
viniciusdecarvalho

Bom tenho um projeto com um crud usando Vraptor3.5 e Extjs 4.2.
Controller Vraptor

@Resource public class UsersController { private final Result result; private final UserDao dao; public UsersController(UserDao dao, Result result) { this.result = result; this.dao = dao; } @Get public void list(Integer start, Integer limit) { try { result.use(ExtJSJson.class).from(dao.list(start, limit)) .total(new Long(dao.rowsCount().toString()).intValue()) .success().serialize(); } @Post @Consumes("application/json") public void save(User data) { dao.save(data); result.use(ExtJSJson.class).from(data).success().serialize(); } @Put @Consumes("application/json") public void update(User data) { dao.update(data); result.use(ExtJSJson.class).from(data).success().serialize(); } @Delete @Consumes("application/json") public void delete(User data) { dao.delete(data); result.use(ExtJSJson.class).from(data).success().serialize(); } }
Store Extjs

Ext.define('AM.store.Users', { extend : 'Ext.data.Store', model : 'AM.model.User', autoLoad: {start: 1, limit: 20}, pageSize : 20, // autoSync: true, proxy : { type : 'ajax', api : { read : 'users/list', create : 'users/save', update : 'users/update', destroy : 'users/delete' }, actionMethods: { read: 'get', create : 'post', update : 'put', destroy : 'delete' }, reader : { type : 'json', root : 'data', successProperty : 'success', totalProperty : 'total' }, writer : { type : 'json', root : 'data', writeAllFields : true, encode : false } } });
Usei o projeto da Loiane pelo JavaCE 2012 como exemplo, https://github.com/loiane/javace-conference-2012
até aí tudo bem consegui fazer o crud funcionar.
Minha dúvida, é possível implementar um método que receberia uma lista de ‘User’,
para por exemplo excluir varios registros em uma unica operação?
Quando tento usar o metodo delete existente, o json que enviado pro servidor tem o seguinte padrão, e acaba excluindo somente o ultimo registro:

{"data": [ {"id":184,"name":"asdas","email":"[email removido]"}, {"id":180,"name":"teste","email":"[email removido]"}, {"id":173,"name":"User","email":"[email removido]"} ] }

5 Respostas

Lucas_Cavalcanti

receber uma lista como json, sem um objeto como wrapper não vai rolar…

tente criar uma classe que tem uma lista de usuarios, e receber esse cara no json.

viniciusdecarvalho
Valeu...
public class Wrapper {

       private List<User> users;
}
Ficou assim, mas quando recebo o objeto, ele esta nulo.
Lucas_Cavalcanti

como vc tá passando e como vc tá recebendo o objeto no controller?

viniciusdecarvalho
Selecionando varios registros na grid do Ext ele manda o json assim:
{"data":[{"id":4,"name":"Beltrano","email":""},{"id":3,"name":"Sicrano","email":""},{"id":1,"name":"Vinicius","email":""}]}
O metodo do controller:
@Delete
@Consumes("application/json")
public void delete(Wrapper data) {
	List<User> users = data.getUsers();
	for (User user : users) {
		userDao.delete(user);
	}
	result.use(ExtJSJson.class).from(users).success().serialize();
}
o trace exibe:
com.thoughtworks.xstream.converters.ConversionException: null : null
---- Debugging information ----
cause-exception     : java.lang.NullPointerException
cause-message       : null
class               : br.app.gestor.util.Wrapper
required-type       : br.app.gestor.util.Wrapper
line number         : -1
-------------------------------
A exception acontece:
@Deserializes({"application/json","json"})
public class JsonDeserializer implements Deserializer{

       public Object[] deserialize(InputStream inputStream, ResourceMethod method) {
		Method javaMethod = method.getMethod();
		Class<?>[] types = javaMethod.getParameterTypes();
		checkArgument(types.length > 0, 
				"Methods that consumes representations must receive just one argument: the root element");
		
		XStream xStream = getConfiguredXStream(javaMethod, types);

		Object[] params = new Object[types.length];

		chooseParam(types, params, xStream.fromXML(inputStream)); //xStream.fromXML(inputStream) lança Exception: Caused by: javax.xml.stream.XMLStreamException:   
                                                                                                            //org.codehaus.jettison.json.JSONException: A JSONObject text must begin with '{' at character 0 of
		return params;
	}
}
Lucas_Cavalcanti

de acordo com o erro ele tá falando que o json deveria começar com {… dá uma olhada se tá chegando esse json que vc falou mesmo.

Criado 1 de junho de 2013
Ultima resposta 7 de jun. de 2013
Respostas 5
Participantes 2