2013-06-27 4 views
1

Использование XStream 1.4.4.Исключение XStream в общем списке

У меня есть следующий XML:

<app name="MyApp"> 
    <properties> 
     <property name="fizz" value="buzz" /> 
     <property name="foo" value="bar" /> 
    </properties> 

    <fruit type="apple" /> 

    <!-- ...etc. --> 
</app> 

и соответствующие объекты POJO для списка свойств, а также сами свойства:

@XStreamAlias("properties") 
public class Properties { 
    private List<Property> properties = new ArrayList<Property>(); 

    public List<Property> getProperties() { 
     return properties; 
    } 

    public void setProperties(List<Property> properties) { 
     this.properties = properties; 
    } 
} 

@XStreamAlias("property") 
public class Property { 
    private String name = null; 

    private String value = null; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 

Когда я пытаюсь запустить следующий код:

XStream xs = new XStream(); 
Strnig xml = getXML(); // Fetches the string of XML from above 
App app = (App)xs.fromXML(xml); 

Я получаю:

Exception in thread "main" com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field com.me.myapp.Properties.property 
---- Debugging information ---- 
field    : property 
class    : com.me.myapp.Properties 
required-type  : com.me.myapp.Properties 
converter-type  : com.thoughtworks.xstream.converters.reflection.ReflectionConverter 
path    : /app/properties/property 
line number   : 4 
class[1]   : com.me.myapp.App 
version    : null 
------------------------------- 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.determineType(AbstractReflectionConverter.java:453) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:294) 
    ...rest of stack trace omitted for brevity 

Где я иду не так?

+0

Как вы ушли? Любой успех или отзывы, поэтому мы можем помочь с ответами? –

+0

Вставьте свой класс приложения –

ответ

3

Аннотации вообще не требуются. Просто используйте псевдоним Property.class как «свойства», и XStream позаботится обо всем остальном для вас.

0

Удалить Properties класс в целом. Удалите псевдонимы XStream с класса Property. Добавить Property класс непосредственно на App класс. Использует следующие псевдонимы, чтобы получить XStream сериализации/десериализации, как вы хотите, чтобы:

xstream.alias("property", Property.class); 
xstream.aliasField("property", Property.class, "properties"); 

Это должно сделать это :-)

0

Проблема

  • У вас есть класс com.me.myapp.Properties, совмещенный с properties
  • Внутри него у вас есть переменная экземпляра под названием properties
  • Это два уровня properties
  • Ваш XML имеет один уровень properties

Мое предложение

  • Поместите аннотацию только над объявлением:

    @XStreamImplicit(itemFieldName="property") 
    private List<Property> properties = new ArrayList<Property>() 
    
  • Это говорит опустить элемент <properties> обертывание Список (неявный список), а также использовать элемент <property> для каждого из них в списке.

Тестирование:

  • После того, как вы думаете, правильно установки, во-первых тест по генерации XML:

    XStream xs = new XStream(); 
    App app = ...;    // Construct & populate a new App object 
    String xml = xs.toXML(app); // Convert to XML 
    System.out.println(xml); 
    // This shows the XML format that must be used to parse XML to App. 
    
0

Этот код преобразования XML (предоставленная Вами) к объекту App. Поскольку ваш данный код был недостаточным, поэтому я вставляю весь этот код здесь.Я думаю, что вы забыли упомянуть xstream.processAnnotations(App.class);

<app name="MyApp"> 
    <properties> 
     <property name="fizz" value="buzz" /> 
     <property name="foo" value="bar" /> 
    </properties> 
</app> 

Классы

package com.xstream; 

import com.thoughtworks.xstream.annotations.XStreamAlias; 

@XStreamAlias("app") 
public class App { 

    @XStreamAlias("properties") 
    private Properties properties; 

    /** 
    * @param properties 
    */ 
    public App(Properties properties) { 
    super(); 
    this.properties = properties; 
    } 

    /** 
    * 
    */ 
    public App() { 
    super(); 
    // TODO Auto-generated constructor stub 
    } 

    /** 
    * @return the properties 
    */ 
    public Properties getProperties() { 
    return properties; 
    } 

    /** 
    * @param properties the properties to set 
    */ 
    public void setProperties(Properties properties) { 
    this.properties = properties; 
    } 

    /* (non-Javadoc) 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
    return "App [properties=" + properties + "]"; 
    } 

} 


---------- 

package com.xstream;                         

import java.util.ArrayList;                        
import java.util.List;                         

import com.thoughtworks.xstream.annotations.XStreamAlias;                
import com.thoughtworks.xstream.annotations.XStreamImplicit;               

@XStreamAlias("properties")                        
public class Properties {                        

    @XStreamImplicit(itemFieldName = "property")                  
    private List<Property> property = new ArrayList<Property>();              

    public List<Property> getProperties() {                    
     return property;                        
    }                             

    public void setProperties(List<Property> properties) {                
     this.property = properties;                      
    }                             

    /**                             
    * @return the property                        
    */                             
    public List<Property> getProperty() {                    
     return property;                         
    }                             

    /**                             
    * @param property the property to set                    
    */                             
    public void setProperty(List<Property> property) {                 
     this.property = property;                       
    }                             

    /* (non-Javadoc)                         
    * @see java.lang.Object#toString()                     
    */                             
    @Override                           
    public String toString() {                       
     return "Properties [property=" + property + "]";                 
    }                             


}                              
---------------- 

package com.xstream; 

import com.thoughtworks.xstream.annotations.XStreamAlias; 
import com.thoughtworks.xstream.annotations.XStreamAsAttribute; 

@XStreamAlias("property") 
public class Property { 

    @XStreamAsAttribute 
    private String name = null; 

    @XStreamAsAttribute 
    private String value = null; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

    /* (non-Javadoc) 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
     return "Property [name=" + name + ", value=" + value + "]"; 
    } 


} 

код для главного класса.

XStream xstream = new XStream(); 
xstream.processAnnotations(App.class); 

App app = null; 
try { 
    app = (App) xstream.fromXML(new FileInputStream(new File("D:/property.xml"))); 
} 
catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 

System.out.println(app.toString());