2011-05-02 171 views
0

我在将xStream解析为xml到对象时遇到问题。操作的属性值从不设置为我的ImportItem对象中的字段操作。对于包含属性的其他元素,我使用自定义转换器,但我不希望为用户使用客户转换器。这是可能的,我该怎么做才能将操作绑定到Item对象?无法使用XStream将属性绑定到对象Java lib

XML:

<persons> 
    <person operation="insert"> 
     <personNumber>196211065104</personNumber> 
     <startDate>2011-04-13T00:00:00.000+02:00</startDate 
     <expireDate>2012-04-14T00:00:00.000+02:00</expireDate 
     <orderDate>2011-04-12T00:00:00.000+02:00</orderDate> 
     <contact type="name">Joe</name> 
     <contact type="email">[email protected]</contact> 
     <contact type="landLine">12345678</contact> 
    </person> 
</persons> 

我厂是这样的:

public class XStreamFactory { 
    public static XStream instace() { 
     XStream xs = new XStream(); 
     xs.aliasType("person", ImportItem.class); 
     xs.useAttributeFor(ImportItem.class, "operation"); <------- 
     xs.aliasType("persons", ImportBatch.class); 
     xs.aliasType("contact", ImportContactData.class); 


     xs.registerConverter(new ImportContactConverter()); 
     xs.registerConverter(new DateConverter()); 
     xs.registerConverter(new ImportOperationConverter()); <------- 

     xs.addImplicitCollection(ImportBatch.class, "items"); 
     xs.addImplicitCollection(ImportItem.class, "contactData", ImportContactData.class); 

     return xs; 
    } 

} 

批次:

@SuppressWarnings({"UnusedDeclaration"}) 
public class ImportBatch { 

    private List<ImportItem> items; 

    public List<ImportItem> getItems() { 
     return items; 
    } 

    @Override 
    public String toString() { 
     return "ImportBatch{" + 
       "items=\n " + StringUtils.join(items, "\n ") + 
       "\n}"; 
    } 
} 

ImportItem:

@SuppressWarnings({"UnusedDeclaration"}) 
public class ImportItem { 

    private ImportOperation operation; 
    private String personNumber; 
    private Date startDate; 
    private Date expireDate; 
    private Date orderDate; 
    private List<ImportContactData> contactData; 

    public ImportOperation getOperation() { 
     return operation; 
    } 

    public void setOperation(ImportOperation operation) { 
     this.operation = operation; 
    } 

    public String getCompanyName() { 
     return companyName; 
    } 

    public String getOrganisationNumber() { 
     return organisationNumber; 
    } 

    public String getItescoID() { 
     return itescoID; 
    } 

    public String getAdID() { 
     return adID; 
    } 

    public Date getStartDate() { 
     return startDate; 
    } 

    public Date getExpireDate() { 
     return expireDate; 
    } 

    public String getContactEmail() { 
     return contactDataFor(email); 
    } 

    public String getContactPerson() { 
     return contactDataFor(businessPerson); 
    } 

    public String getContactPhone() { 
     return contactDataFor(landLine); 
    }   
} 

新ImportOperation代码:< ------

public class ImportOperation { 

    public enum OperationType{insert, update, delete} 

    private OperationType operation; 

    public ImportOperation(OperationType operation) { 
     this.operation = operation; 
    } 

    public OperationType getOperation() { 
     return operation; 
    } 

    public void setOperation(OperationType operation) { 
     this.operation = operation; 
    } 


} 

新的转换代码:< ------

public class ImportOperationConverter implements SingleValueConverter { 

    public String toString(Object obj) { 
     return ((ImportOperation)obj).getOperation().toString(); 
    } 

    public Object fromString(String str) { 
     return new ImportOperation(ImportOperation.OperationType.valueOf(str)); 
    } 

    public boolean canConvert(Class clazz) { 
     return clazz == ImportOperation.class; 
    } 
} 
+0

ImportContactConverter的外观如何? – 2011-05-02 13:28:35

+0

我很高兴帮助你。但是当你更新你的问题时请小心。因为一个有同样问题的人如果他读到这个问题,就不会知道问题是什么,并且会接受这个问题。 – Ralph 2011-05-03 07:03:54

+0

我同意,请留下您的问题没有你自己<---在它的答案。这很混乱 – jule64 2014-02-14 10:38:00

回答

4

你需要告诉XStream的是,现场操作是一个XML属性。

添加

xs.useAttributeFor(ImportItem.class, "operation"); 

@see XStream Alias Tutorial

的原因是,XStream的地图默认一切XML领域。如果你解组一个对象,并且一个Object字段没有在XML中定义,那么默认情况下,XStream会将它设置为NULL。 - 将这两部分放在一起解释行为,并告诉你该怎么做。 - >配置映射,以便将Person.operation映射到该属性。

+0

谢谢!那正是我需要的!更新我的代码以显示正确的impl。 – jakob 2011-05-02 14:47:06

+0

<----标记位置:) – jakob 2011-05-02 14:55:06