Невозможно привязать атрибут к объекту с помощью Java-библиотеки XStream - PullRequest
0 голосов
/ 02 мая 2011

У меня проблемы с удалением xml с помощью XStream для объекта.Значение атрибута для операции никогда не устанавливается на полевую операцию в моем объекте ImportItem.Для других моих элементов, которые содержат атрибуты, я использую пользовательские конвертеры, но я бы предпочел не использовать конвертер клиента для человека.Возможно ли это и как мне сделать это, чтобы привязать операцию к объекту Item?

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">test@test.com</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: <------ </p>

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;
    }


}

Новый код преобразователя: <----- </p>

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;
    }
}

1 Ответ

4 голосов
/ 02 мая 2011

Вы должны сообщить XStream, что полевая операция является атрибутом xml.

add

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

@ see Руководство по псевдониму XStream

Причина в том, что XStream по умолчанию отображает все в поля XML.Если вы отменяете вызов объекта и поле «Объект» не определено в XML, XStream по умолчанию установит для него значение NULL.- Соединение этих двух частей объясняет поведение и говорит вам, что делать.-> Настройте сопоставление так, чтобы Person.operation сопоставлялся с атрибутом.

...