2016-09-19 5 views
3

В настоящее время у меня есть служба REST Spring, которая может генерировать JSON и XML, но ответ XML не совсем то, что я ищу.Настройка ответа Jackson XML в Spring REST

Это то, что я построить до сих пор есть:

объекта XSD

<xs:element name="project"> 
    <xs:complexType> 
     <xs:complexContent> 
      <xs:extension base="projectBase"/> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:element> 

<xs:complexType name="projectBase"> 
    <xs:attribute type="xs:string" name="name" use="required" /> 
    <xs:attribute type="xs:string" name="id" use="optional" /> 
    <xs:attribute type="xs:anyURI" name="self" use="optional" /> 
</xs:complexType> 

ПОМ

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.dataformat</groupId> 
    <artifactId>jackson-dataformat-xml</artifactId> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-annotations</artifactId> 
</dependency> 

Контроллер

@ApiOperation(value = "GET", 
     notes = "Returns a list of exisiting projects.") 
@RequestMapping(method = RequestMethod.GET, produces = {"application/smartask.projectsV1+xml", "application/smartask.projectsV1+json"}) 
public List<be.smartask.api.model.smartask.Project> getProjects(@ApiParam(value = "page of found projects", required = false) @RequestParam(value = "page", required = false, defaultValue = "0") int page, 
                   @ApiParam(value = "size(min:5, max:50) of projects on a page", required = false) @RequestParam(value = "size", required = false, defaultValue = "10") int size) throws ServiceException, ConversionException { 
    String uri = getURLWithContextPath(this.request); 
    List<be.smartask.api.model.smartask.Project> projects = projectConverter.convertToObjectList(projectService.findAll(page, size), uri); 
    return projects; 
} 

Результат I получить, когда я выполню этот g etProjects метод

<List xmlns=""> 
    <item> 
    <name>project1</name> 
    <id>7a666889-9b03-4790-8100-d41a9de66a63</id> 
    <self>http://localhost/ask/projects/7a666889-9b03-4790-8100-d41a9de66a63</self> 
    </item> 
    <item> 
    <name>project2</name> 
    <id>f784ede1-d019-46e9-b7a4-83c51d6f7d8e</id> 
    <self>http://localhost/ask/projects/f784ede1-d019-46e9-b7a4-83c51d6f7d8e</self> 
    </item> 
    <item> 
    <name>project3</name> 
    <id>936e3ed9-b8c6-46ab-9570-60dcfcaaa670</id> 
    <self>http://localhost/ask/projects/936e3ed9-b8c6-46ab-9570-60dcfcaaa670</self> 
    </item> 
    <item> 
    <name>project4</name> 
    <id>4eaa6045-bbc4-423d-8bae-1da11692114b</id> 
    <self>http://localhost/ask/projects/4eaa6045-bbc4-423d-8bae-1da11692114b</self> 
    </item> 
</List> 

Что уже довольно близко, но я хотел бы заменить список и Элемент тег с проектами и Project.

До сих пор я пытался добавить различные аннотаций как

  • @JacksonXmlElementWrapper (useWrapping = ложь)
  • @JsonTypeInfo (использование = JsonTypeInfo.Id.NAME, включают в себя = JsonTypeInfo.As.WRAPPER_OBJECT)
  • @JacksonXmlElementWrapper (useWrapping = истинные, LocalName = "проекты")
  • @JacksonXmlProperty (LocalName = "проект")
  • @JacksonXmlRootElement (LocalName = "проект")

Первые 4, которые я использовал в моем методе контроллера, и последний, который я использовал для сгенерированного объекта (как Project, так и ProjectBase), но ничего не происходит.

Что я делаю неправильно или что я забыл сделать для этого?

Я хотел бы, чтобы мой выход JSON, как это хотя

[ 
    { 
    "name": "project1", 
    "id": "7a666889-9b03-4790-8100-d41a9de66a63", 
    "self": "http://localhost/ask/projects/7a666889-9b03-4790-8100-d41a9de66a63" 
    } 
] 

и не

{ 
    "Projects": { 
     "Project": [{ 
      "name": "project1", 
      "id": "7a666889-9b03-4790-8100-d41a9de66a63", 
      "self": "http://localhost/ask/projects/7a666889-9b03-4790-8100-d41a9de66a63" 
     }] 
    } 
} 

Редактировать # 1

Кто-то предложил мне взглянуть на это руководство:

https://pascaldimassimo.com/2010/04/13/how-to-return-a-single-json-list-out-of-mappingjacksonjsonview/

, но не удалось выполнить эту работу.

ответ

0

Решение не пыталось адаптировать выход XML, но для адаптации выхода JSON. Мне пришлось создать объект-обертку «Проекты».

<xs:element name="projects"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="project" minOccurs="0" maxOccurs="unbounded"> 
       <xsd:annotation> 
        <xsd:appinfo> 
        <annox:annotate target="getter">@com.fasterxml.jackson.annotation.JsonValue</annox:annotate> 
        </xsd:appinfo> 
       </xsd:annotation> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

что приводит к

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "project" 
}) 
@XmlRootElement(name = "projects") 
public class Projects { 

    protected List<Project> project; 

    @JsonValue 
    public List<Project> getProject() { 
    if (project == null) { 
     project = new ArrayList<Project>(); 
    } 
    return this.project; 
    } 

} 

По аннотированию сорбента с @JsonValue будет удалять обертку «Проекты» объект на выходе JSON

Вам нужны какая-то дополнительная настройка для создания аннотаций хотя см.: https://github.com/highsource/jaxb2-annotate-plugin

Смежные вопросы