2011-05-02 104 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