Java Bean Persistence con XMLencoder -- java campo con persistence campo con javabeans camp Relacionados El problema

Java Bean Persistence with XMLEncoder


3
vote

problema

Español

He escrito una clase de frijoles que contiene un hashmultiMap (de la biblioteca de guayaba). Me gustaría que XML codifique el frijol con XMLencoder de JRE. Uso de un PersistencedLegate personalizado He escrito con éxito el frijol a archivo. Sin embargo, cuando intento deserializar el XML, obtengo la excepción:

java.lang.NoSuchMethodException: <unbound>=HashMultimap.put("pz1", "pz2")

¿Qué estoy haciendo mal?

  ~/.sbt/update.log0  
Original en ingles

I've written a bean class containing a HashMultiMap (from the Guava library). I would like to XML encode the bean using the JRE's XMLEncoder. Using a custom PersistenceDelegate I've successfully written the bean to file. However, when I attempt to deserialize the XML I get the exception:

java.lang.NoSuchMethodException: <unbound>=HashMultimap.put("pz1", "pz2")

What am I doing wrong?

// create the bean SomeBean sb = new SomeBean();  // add some data HashMultimap<String, String> stateMap = HashMultimap.create();     stateMap.put("pz1", "pz2"); stateMap.put("pz3", "pz4");  sb.setStateMap(stateMap);  // encode as xml  FileOutputStream os = new FileOutputStream("myXMLFile.xml"); XMLEncoder encoder = new XMLEncoder(os); encoder.setPersistenceDelegate(HashMultimap.class, new CustomPersistenceDelegate()); encoder.writeObject(sb);  // decode the xml FileInputStream is = new FileInputStream("myXMLFile.xml");  XMLDecoder decoder = new XMLDecoder(is); Object deSerializedObject = decoder.readObject();  class CustomPersistenceDelegate extends DefaultPersistenceDelegate {     protected Expression instantiate(Object oldInstance, Encoder out)     {         return new Expression(oldInstance, oldInstance.getClass(), "create", null);     }      protected void initialize(Class<?> type, Object oldInstance, Object newInstance,                               Encoder out)     {         super.initialize(type, oldInstance, newInstance, out);          com.google.common.collect.HashMultimap<String, String> m =             (com.google.common.collect.HashMultimap) oldInstance;          for (Map.Entry<String, String> entry : m.entries())         {             out.writeStatement(new Statement(oldInstance, "put",              new Object[] { entry.getKey(), entry.getValue() }));         }      } }  public class SomeBean {     private HashMultimap<String, String> stateMap;      public HashMultimap<String, String> getStateMap()     {         return stateMap;     }      public void setStateMap(HashMultimap<String, String> stateMap)     {         this.stateMap = stateMap;     } } 
        
         
         

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

No tengo una solución (todavía). Pero aquí hay algo que al menos aclara el problema. Parece que algún cambio realizado en Java 7 Build 15 y más se ha roto el método de búsqueda de que su declaración requiere. Si agrega un ExceptionListener a la XMLencoder, le da una mejor idea de cómo está fallando esto:

          encoder.setExceptionListener(new ExceptionListener() {         @Override         public void exceptionThrown(Exception e) {             System.out.println("got exception. e=" + e);             e.printStackTrace();         }     });   

verá un stacktrace completo entonces:

  java.lang.Exception: Encoder: discarding statement HashMultimap.put(Object, Object); at java.beans.Encoder.writeStatement(Encoder.java:306) at java.beans.XMLEncoder.writeStatement(XMLEncoder.java:400) at test2.XmlEncoderTest$CustomPersistenceDelegate.initialize(XmlEncoderTest.java:83) at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:118) at java.beans.Encoder.writeObject(Encoder.java:74) at java.beans.XMLEncoder.writeObject(XMLEncoder.java:327) at java.beans.Encoder.writeExpression(Encoder.java:330) at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:454) at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:115) at java.beans.Encoder.writeObject(Encoder.java:74) at java.beans.XMLEncoder.writeObject(XMLEncoder.java:327) at java.beans.Encoder.writeExpression(Encoder.java:330) at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:454) at java.beans.DefaultPersistenceDelegate.doProperty(DefaultPersistenceDelegate.java:194) at java.beans.DefaultPersistenceDelegate.initBean(DefaultPersistenceDelegate.java:253) at java.beans.DefaultPersistenceDelegate.initialize(DefaultPersistenceDelegate.java:400) at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:118) at java.beans.Encoder.writeObject(Encoder.java:74) at java.beans.XMLEncoder.writeObject(XMLEncoder.java:327) at java.beans.Encoder.writeExpression(Encoder.java:330) at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:454) at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:115) at java.beans.Encoder.writeObject(Encoder.java:74) at java.beans.XMLEncoder.writeObject(XMLEncoder.java:327) at java.beans.Encoder.writeObject1(Encoder.java:258) at java.beans.Encoder.cloneStatement(Encoder.java:271) at java.beans.Encoder.writeStatement(Encoder.java:301) at java.beans.XMLEncoder.writeStatement(XMLEncoder.java:400) at java.beans.XMLEncoder.writeObject(XMLEncoder.java:330)      ...  Caused by: java.lang.NoSuchMethodException: HashMultimap.put(Object, Object);     at java.beans.Statement.invokeInternal(Statement.java:313)     at java.beans.Statement.access$000(Statement.java:58)     at java.beans.Statement$2.run(Statement.java:185)     at java.security.AccessController.doPrivileged(Native Method)     at java.beans.Statement.invoke(Statement.java:182)     at java.beans.Statement.execute(Statement.java:173)     at java.beans.Encoder.writeStatement(Encoder.java:304)     ... 51 more   

La sección causada por muestra que no pudo localizar el método PUT . Me parece que esto sucede porque no puede igualar la firma del método correctamente más. Falla en el MethodFinder de Frijas Java, pero como el código fuente no está incluido en JDK, no pude seguirlo lo suficientemente bien.

Si puedo encontrar la causa exacta, actualizaré esto. Solo quería proporcionarle más información mientras tanto.

actualización

Creo que es un error en estas versiones posteriores. Aquí hay una prueba de unidad que expone el error (o el comportamiento inesperado) más directamente. El fallo a continuación es exactamente lo que está sucediendo en su código:

  @Test public void testMethodFinder() throws Exception {      Method m0 = MethodFinder.findMethod(this.getClass(), "setUp", new Class<?>[0]);     assertNotNull(m0);      // this is okay, because method is declared in the type referenced     Method m = MethodFinder.findMethod(Multimap.class, "put", new Class<?>[] { Object.class, Object.class });     assertNotNull(m);      try {         // this fails, apparently because method is not declared in this subclass (is inherited from parent class)         Method m2 = MethodFinder.findMethod(HashMultimap.class, "put", new Class<?>[] { Object.class, Object.class });         assertNotNull(m2);     } catch (Exception e) {         System.out.println("got exception. e=" + e);     } }   
 

I don't have a solution (yet). But here is something which at least clarifies the problem. It seems that some change made in Java 7 build 15 and higher has broken the method look up that your Statement requires. If you add an ExceptionListener to the XmlEncoder, it gives you a better idea of how this is failing:

        encoder.setExceptionListener(new ExceptionListener() {         @Override         public void exceptionThrown(Exception e) {             System.out.println("got exception. e=" + e);             e.printStackTrace();         }     }); 

You will see a full stacktrace then:

java.lang.Exception: Encoder: discarding statement HashMultimap.put(Object, Object); at java.beans.Encoder.writeStatement(Encoder.java:306) at java.beans.XMLEncoder.writeStatement(XMLEncoder.java:400) at test2.XmlEncoderTest$CustomPersistenceDelegate.initialize(XmlEncoderTest.java:83) at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:118) at java.beans.Encoder.writeObject(Encoder.java:74) at java.beans.XMLEncoder.writeObject(XMLEncoder.java:327) at java.beans.Encoder.writeExpression(Encoder.java:330) at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:454) at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:115) at java.beans.Encoder.writeObject(Encoder.java:74) at java.beans.XMLEncoder.writeObject(XMLEncoder.java:327) at java.beans.Encoder.writeExpression(Encoder.java:330) at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:454) at java.beans.DefaultPersistenceDelegate.doProperty(DefaultPersistenceDelegate.java:194) at java.beans.DefaultPersistenceDelegate.initBean(DefaultPersistenceDelegate.java:253) at java.beans.DefaultPersistenceDelegate.initialize(DefaultPersistenceDelegate.java:400) at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:118) at java.beans.Encoder.writeObject(Encoder.java:74) at java.beans.XMLEncoder.writeObject(XMLEncoder.java:327) at java.beans.Encoder.writeExpression(Encoder.java:330) at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:454) at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:115) at java.beans.Encoder.writeObject(Encoder.java:74) at java.beans.XMLEncoder.writeObject(XMLEncoder.java:327) at java.beans.Encoder.writeObject1(Encoder.java:258) at java.beans.Encoder.cloneStatement(Encoder.java:271) at java.beans.Encoder.writeStatement(Encoder.java:301) at java.beans.XMLEncoder.writeStatement(XMLEncoder.java:400) at java.beans.XMLEncoder.writeObject(XMLEncoder.java:330)      ...  Caused by: java.lang.NoSuchMethodException: HashMultimap.put(Object, Object);     at java.beans.Statement.invokeInternal(Statement.java:313)     at java.beans.Statement.access$000(Statement.java:58)     at java.beans.Statement$2.run(Statement.java:185)     at java.security.AccessController.doPrivileged(Native Method)     at java.beans.Statement.invoke(Statement.java:182)     at java.beans.Statement.execute(Statement.java:173)     at java.beans.Encoder.writeStatement(Encoder.java:304)     ... 51 more 

The Caused by section shows that it failed to locate the put method. It looks to me like this happens because it can't match the method signature properly any more. It fails in the java beans MethodFinder, but since the source code is not included in JDK, I couldn't track it down well enough.

If I can find exact cause, I will update this. Just wanted to provide you with more information in the meantime.

UPDATE

I think it's a bug in these later versions. Here is a unit test which exposes the bug (or unexpected behavior) more directly. The failure below is exactly what is happening in your code:

@Test public void testMethodFinder() throws Exception {      Method m0 = MethodFinder.findMethod(this.getClass(), "setUp", new Class<?>[0]);     assertNotNull(m0);      // this is okay, because method is declared in the type referenced     Method m = MethodFinder.findMethod(Multimap.class, "put", new Class<?>[] { Object.class, Object.class });     assertNotNull(m);      try {         // this fails, apparently because method is not declared in this subclass (is inherited from parent class)         Method m2 = MethodFinder.findMethod(HashMultimap.class, "put", new Class<?>[] { Object.class, Object.class });         assertNotNull(m2);     } catch (Exception e) {         System.out.println("got exception. e=" + e);     } } 
 
 

Relacionados problema

0  Guardar un archivo PNG en un servidor en un frijol Java, usando JSTL  ( Saving a png file on a server in a java bean using jstl ) 
Estoy escribiendo una página de actualización en JSTL donde el usuario ingresa algunos números. Luego, llamo a un frijol Java, pasando los números como paráme...

1  Propiedades de frijol java de inicialización profunda [cerradas]  ( Deep initialising java bean properties ) 
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las...

0  ¿Por qué no se muestra mi icono de Javean?  ( Why doesnt my javabean icon display ) 
Estoy usando NetBeans 6.7.1 En Windows Vista, tengo un componente de Javean que funciona como debería y esto tiene una clase de beaninfo asociada donde he est...

0  Dozer # Can Dozer apoya el polimorfismo?  ( Dozer can dozer supports polymorphism ) 
Por favor, consulte la siguiente estructura de My SourceClass y DestinationClass. public class SourceClass { // Some Mapping Goes here protected S...

0  Javax.El.PropertyNotFoundException usando JSF, JPA, Java EE  ( Javax el propertynotfoundexception using jsf jpa java ee ) 
Estoy trabajando en un proyecto pequeño y, después de que todo estuvo funcionando correctamente, de repente, comencé a obtener un {namespace template} /** ...

5  ¿Cuáles pueden ser las razones por las que cuelga Spring STS?  ( What can be the reasons that spring sts hangs ) 
A veces en el principio STS se cuelga. ¿Se puede encontrar la razón? ¿Se puede existir el registro o el posible inicio en modo de depuración? Además, ¿cómo ...

1  Javabeans en JSP usando la acción de UsoBean  ( Javabeans in jsp using usebean action ) 
He creado la siguiente clase Java. public class TestClass { public TestClass () { } public String getName() { return "Rishi"; }...

0  ¿Por qué el estándar javabean es para booleans en lugar de obtener  ( Why is the javabean standard to is for booleans instead of get ) 
¿Por qué el estándar Javean Standard se establece para usar el prefijo, para un getter en lugar de obtener -? Parece que es un lugar realmente fuera para un...

5  ¿Para qué es bueno un "configuración de configuración" de Spring Spring STS de Eclipse?  ( What is an eclipse spring sts config set good for ) 
Tengo el complemento Spring STS activado dentro de mi proyecto Eclipse. Hacer esto permitido muchas funciones de resortes geniales que incluyen la gestión esp...

0  Transferencia de objeto de colección de un JSP a otro  ( Transferring collection object from one jsp to another ) 
Obtengo los datos de la base de datos y lo almacené en algún objeto de recolección en un JSP (diga ONE.JSP). Quiero que este objeto de colección esté disponib...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos