Unmarshalling List <foo>с JAXB / Джерси - PullRequest
2 голосов
/ 15 февраля 2012

Я хочу, чтобы маршал / демаршал 2 пользовательских типа. И тип 1 имеет список. Маршаллинг работает должным образом - я вижу отдельный элемент для каждого элемента type2 в списке, но когда я пытаюсь его разархивировать, это не работает.

Workflow

@XmlRootElement
public class Workflow {

    private String userEmail;
    private List<WorkflowStep> steps = new ArrayList<WorkflowStep>(5);

    //required by jaxb
    public Workflow() { 

    }

    public void setSteps(List<WorkflowStep> steps) {
        this.steps = steps;
    }

    public List<WorkflowStep> getSteps() {
        //do a defensive copy
        return new ArrayList<WorkflowStep>(steps);
    }

    public void setUserEmail(String email) {
        userEmail = email;
    }

    public String getUserEmail() {
        return userEmail;
    }

}

WorkflowStep

@XmlRootElement
public class WorkflowStep {

    private int cpu = 1;
    private int mem = 1000;
    private Map<String, String> parameters = Collections.emptyMap();


    public WorkflowStep() { 

    }

    public void setCpu(int numCores) {
        cpu = numCores;
    }

    public int getCpu() { 
        return cpu;
    }

    public void setMem(int mb) {
        mem = mb;
    }

    public int getMem() {
        return mem;
    }

}

Вот пример выходных данных, если я получаю доступ к веб-службе из браузера:

   <workflow>
    <steps>
        <cpu>1</cpu>
        <inputId>237</inputId>
        <mem>1000</mem>
        <parameters/>
        <status>NOT-YET-STARTED</status>
        <stepId>1509</stepId>
        <submoduleId>0</submoduleId>
        <workflowId>797</workflowId>
    </steps>
    <steps>
        <cpu>1</cpu>
        <inputId>364</inputId>
        <mem>1000</mem>
        <parameters/>
        <status>NOT-YET-STARTED</status>
        <stepId>1510</stepId>
        <submoduleId>3</submoduleId>
        <workflowId>797</workflowId>
    </steps>

    <userEmail>foo@bar.com</userEmail>
    <workflowId>797</workflowId>
    <workflowName>test-name</workflowName>
</workflow>

WorkflowStep успешно маршалируется / демаршализируется, но список не может быть демаршалирован, почему это так? Ни сервер приложений, ни REST-клиент не получают никаких ошибок или исключений, клиент просто игнорирует список WorkflowSteps? Исходя из приведенного выше примера, я ожидаю, что каждый элемент будет преобразован в объект типа WorkflowStep, а затем будет автоматически добавлен в список?

1 Ответ

6 голосов
/ 15 февраля 2012

Проблема с этим методом:

public List<WorkflowStep> getSteps() {
    //do a defensive copy
    return new ArrayList<WorkflowStep>(steps);
}

Ваша реализация JAXB проверяет, существует ли уже List для этого метода и использует ли он его.List, который вы возвращаете, не удерживается объектом, который вы демаршируете, поэтому после немаршальной операции List теряется.

Опция № 1 - изменение getSteps() метода

public List<WorkflowStep> getSteps() {
    //don't do a defensive copy
    return steps;
}

Вариант № 2 - Использовать доступ к полю

Вы можете изменить это, указав, что JAXB должен использовать доступ к полю.

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Workflow {
   ...
}

Для получения дополнительной информации

...