2012-03-08 22 views
13

Estoy recibiendo el siguiente error cuando intenta crear una instancia de 'Transacao'Xstream no-args

`Error: Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor : Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor ` 

---- Debugging information ---- 

message : Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor 

cause-exception : com.thoughtworks.xstream.converters.reflection.ObjectAccessException 

cause-message : Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor ` 

class : br.com.cbmp.ecommerce.resposta.Transacao 

required-type : br.com.cbmp.ecommerce.resposta.Transacao 

path : /transacao 

Soy consciente de que hay un error con xstream 1.3.1 y JDK7, pero Actualmente estoy usando XStream 1.3.1 y JDK6. ¿Alguna idea de por qué sigue ocurriendo este error?

Gracias

+1

¿Tiene clase un constructor que no sea arg? Si no escribe un constructor utiliza el constructor no-arg de 'Object', pero si escribe un constructor no tiene que proporcionar su propio constructor no-arg. – twain249

+0

@ twain249 la clase sí tiene un constructor con argumentos, lo que me lleva a la pregunta: ¿realmente tengo que crear un constructor sin argumentos? Necesito pasar los parámetros, o la clase no funcionará.Si agrego el constructor no-arg, llamará a este constructor y el objeto estará incompleto, lo que dará como resultado una excepción NullPointerException –

+1

Tuve un problema similar hace un tiempo con un proyecto web dinámico que quería que definiera un constructor sin argumentos y una vez que hice todo parecía funcionar. No sé exactamente por qué era necesario (supongo que cuando el servicio REST intentaba crear una respuesta sin datos, se llamaba de manera predeterminada), pero hasta donde puedo decir que no afectó el rendimiento de mi código. Todo lo que hice en el constructor fue llamar a 'super()' – twain249

Respuesta

5

Respuesta simple: todas las clases internas deberán ser marcadas estática, o si debe utilizar, por ejemplo, completa no clases internas

Respuesta larga: Java hace algunas cosas automáticamente, y se ha encontrado con un caso marginal (Consulte here). Es (sobre todo) imposible para una clase interna tener un constructor sin args. Java siempre agrega un argumento a cualquier constructor en una clase interna/local, y ese argumento es una referencia a la clase padre. Esto se usa para que pueda acceder a todas las variables/métodos del padre, pero significa que incluso un constructor sin args (en código) tiene (cuando usa el reflejo, como xstream) un argumento. Para corregir, marque la clase como estática para que ya no sea necesario heredar todos los métodos/variables de la clase padre.

+1

+1 Gracias por la respuesta larga, es bueno saber por qué ocurren las cosas en lugar de solo cómo resolverlas. También resolvió mi problema. – RyanfaeScotland

+1

Actualicé a XStream 1.4.4 como JRL dijo que no funcionó, pero esto funcionó para mí, gracias @Hamy – praveenb

17

3 soluciones:

  1. proporcionar un constructor sin argumentos (obvio)
  2. Establecer como objeto implementar Serializable.
  3. Promueve a XSTREAM 1.4.4 *

utilizo la solución # 2 todo el tiempo.

* verifiqué 1.2.2 no funciona y 1.4.4 funciona, no se han tratado en las versiones entre

+0

Estoy usando XStream 1.4.4 con JDK6 y tengo un problema similar. No puedo usar la solución 1 o 2. ¿Alguna otra idea? – cadavre

2

xstream 1.3.1 no soporta más la deserialización bajo JDK 1.7 si no hay un constructor no-arg.

Resolución:

1) Para resolver este problema, es necesario utilizar JDK6 si desea continuar con 1.3.1 frasco.

2) Si utiliza JDK7 o posterior para resolver este problema, debe actualizar JAR xstream.jar 1.3.1 para su posterior publicación.

Para obtener más información, consulte https://jira.atlassian.com/browse/JRA-32823.

Cuestiones relacionadas