2016-09-19 17 views
3

現在、私はJSONとXMLを生成できるSpring RESTサービスを持っていますが、私が探しているものではないXMLレスポンスを生成しています。Spring RESTでジャクソンXMLレスポンスをカスタマイズする

これは私がこれまで構築してきたものであるが、次のとおりです。

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> 

POM

<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> 

ですが、私はプロジェクトとプロジェクトとリストとアイテムのタグを交換したいと思います。

これまでのところ、私は

  • @JacksonXmlElementWrapper(useWrapping = false)を
  • @JsonTypeInfoのようなさまざまな注釈を追加しようとしました(使用= JsonTypeInfo.Id.NAME、= JsonTypeInfo.As.WRAPPER_OBJECT含めます)
  • @JacksonXmlElementWrapper(useWrapping = trueの場合、ローカル名は= "プロジェクト")
  • @JacksonXmlProperty(ローカル名= "プロジェクト")
  • @JacksonXmlRootElement(ローカル名= "プロジェクト")

最初の4私は自分のコントローラーメソッドで使用したものと、生成されたオブジェクト(ProjectとProjectBaseの両方)で最後に使用したものは何も起こりません。

私は間違っていますか、これを達成するのを忘れましたか?

それはしかし

[ 
    { 
    "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" 
     }] 
    } 
} 

であるように私は私のJSON出力を維持したいと思います編集は#1

誰かがこのガイドを見てみるために私を示唆しました。

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

しかし、この作業には成功していません。

答えて

0

解決策は、XML出力を適合させようとせず、JSON出力を適合させることでした。私はラッピングオブジェクト "プロジェクト"を作成しなければなりませんでした。JSON出力に@JsonValueとゲッターそれはラッピングを削除します「プロジェクト」のオブジェクトに注釈を付けることで

@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; 
    } 

} 

になり

<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> 

あなたは注釈を生成するためのいくつかの追加の設定が必要ですしかし、参照してください:https://github.com/highsource/jaxb2-annotate-plugin

関連する問題