Victor Mezrin
Victor Mezrin

Reputation: 2847

REST, JAXB, jersey 2, JSON, field of type List<>

I have a RESTful service with some methods. Methods are annotated by @POST and @Consumes(MediaType.APPLICATION_JSON).

I have wrapper for request parameters:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class RequestWrapper {

    @XmlElement
    private SomeInfo someInfo = new SomeInfo();

    @XmlElement
    @XmlElementWrapper
    private List<RequestParameter> requestParameters = new ArrayList<>();
}

public class SomeInfo {
    public String field1;
    public String field2;
}

public class RequestParameter {
    public String key;
    public String value;
}

I make request to my service. Body of the POST message:

{"someInfo":{"field1":"b","field2":"c"},"requestParameters":[{"key":"1","value":"2"},{"key":"3","value":"4"}]}

I see that someInfo values processed and accesible via RequestWrapper. But List<RequestParameter> requestParameters has zero length.

What should I do to messages been processed normally?

P.S. I use Glassfish 4.0. Dependencies of the maven module:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-processing</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>

Upvotes: 1

Views: 415

Answers (1)

Victor Mezrin
Victor Mezrin

Reputation: 2847

omg, I have found magic bullet

Delete @XmlAccessorType(XmlAccessType.FIELD)

Delete @XmlElementWrapper

make public getters/setters for each field

@XmlRootElement
public class RequestWrapper {
    @XmlElement
    private SomeInfo someInfo = new SomeInfo();
    @XmlElement
    private List<RequestParameter> requestParameters = new ArrayList<>();

    // getters/setters for each field
}

Upvotes: 2

Related Questions