A message body writer for Java class java.util.ArrayList...and MIME media type text/xml was not found A message body writer for Java class java.util.ArrayList...and MIME media type text/xml was not found xml xml

A message body writer for Java class java.util.ArrayList...and MIME media type text/xml was not found


Use

List<String> list = new ArrayList<String>();GenericEntity<List<String>> entity = new GenericEntity<List<String>>(list) {};Response response = Response.ok(entity).build();

The Generic entity wrapper works to get the output when using the Response builder.

Reference


NOTE: Although this answer works, anar's answer is better.

You should try to use a JAXB annotated class to solve your problem. You could change your method to this:

@GET@Produces(MediaType.TEXT_XML)@Path("/directgroups")public Groups getDirectGroupsForUser(@PathParam("userId") String userId) {    try {        Groups groups = new Groups();        groups.getGroup().addAll(service.getDirectGroupsForUser(userId, null, true));        return groups;    } catch (UserServiceException e) {        LOGGER.error(e);        throw new RuntimeException(e.getMessage());    }}

And then create a JAXB annotated class for your groups. I have included a generated class for you, using the process described in this answer. Here is an example of the documents that it will produce:

<groups>  <group>Group1</group>  </group>Group2</group></groups>

And here is the generated class:

package example;import java.util.ArrayList;import java.util.List;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType;/** * <p>Java class for anonymous complex type. *  * <p>The following schema fragment specifies the expected content contained within this class. *  * <pre> * <complexType> *   <complexContent> *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> *       <sequence> *         <element ref="{}group" maxOccurs="unbounded"/> *       </sequence> *     </restriction> *   </complexContent> * </complexType> * </pre> *  *  */@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "", propOrder = {    "group"})@XmlRootElement(name = "groups")public class Groups {    @XmlElement(required = true)    protected List<String> group;    /**     * Gets the value of the group property.     *      * <p>     * This accessor method returns a reference to the live list,     * not a snapshot. Therefore any modification you make to the     * returned list will be present inside the JAXB object.     * This is why there is not a <CODE>set</CODE> method for the group property.     *      * <p>     * For example, to add a new item, do as follows:     * <pre>     *    getGroup().add(newItem);     * </pre>     *      *      * <p>     * Objects of the following type(s) are allowed in the list     * {@link String }     *      *      */    public List<String> getGroup() {        if (group == null) {            group = new ArrayList<String>();        }        return this.group;    }}


The only thing that worked for me so far is to create my own Wrapper object.

Don't forget the @XmlRootElement annotation to explain JAXB how to parse it.

Note that this will work for any type of object - in this example I used ArrayList of String.

e.g.

The Wrapper object should look like this:

import java.util.ArrayList;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElementpublic class ArrayListWrapper {    public ArrayList<String> myArray = new ArrayList<String>();}

And the REST method should look like this:

@GET@Produces(MediaType.TEXT_XML)@Path("/directgroups")public ArrayListWrapper getDirectGroupsForUser(@PathParam("userId") String userId) {    try {        ArrayListWrapper w = new ArrayListWrapper();        w.myArray = service.getDirectGroupsForUser(userId, null, true);        return w;    } catch (UserServiceException e) {        LOGGER.error(e);        throw new RuntimeException(e.getMessage());    }}