A message body writer for Java class java.util.ArrayList...and MIME media type text/xml was not found
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()); }}