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

后端 未结 4 884
孤独总比滥情好
孤独总比滥情好 2020-11-28 11:11

Im using Jersey to build a REST Service and want to return a Collection as XML.

@GET
@Produces(MediaType.TEXT_XML)
@Path(\"/direct         


        
相关标签:
4条回答
  • 2020-11-28 11:42

    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>
     * &lt;complexType>
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;element ref="{}group" maxOccurs="unbounded"/>
     *       &lt;/sequence>
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/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;
        }
    
    }
    
    0 讨论(0)
  • 2020-11-28 11:42

    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

    0 讨论(0)
  • 2020-11-28 11:57

    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;
    
    @XmlRootElement
    public 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());
        }
    }
    
    0 讨论(0)
  • 2020-11-28 12:01

    adding @XmlRootElement(name = "class name") to the object I want to return , resolved my issue

    0 讨论(0)
提交回复
热议问题