2016-07-11 5 views
2

私のコントローラの同じメソッドからXMLとJSON応答を生成しようとしています。 JSONがクラスパス上にあるので、JSONが春のデフォルトであることがわかりました。しかし、XMLでは、JAXBの依存関係を追加し、JAXBアノテーションでモデルに注釈を付ける必要がありました。また、@RequestMappingアノテーションのproduce属性を変更する必要がありました。Spring 4 mvc REST XMLとJSONレスポンス

ここで、私のデフォルトの動作が変更され、XML応答が返されます。 値application/jsonのリクエストにcontent-Typeヘッダーを追加した後、私の応答はJSONになりますが、悲しいことにそうではありません。 以下は私のコードは次のとおりです。 -

package com.example.controller; 

import org.springframework.http.MediaType; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 

import com.example.domain.Person; 

@RestController("person") 
public class PersonController { 

    @RequestMapping(name ="getperson", produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE}) 
    public Person getPerson() { 
     Person p = new Person(); 
     p.setAge(28); 
     p.setEmail("[email protected]"); 
     p.setName("Amar"); 
     return p; 
    } 

} 

Modelクラス: -

package com.example.domain; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Person { 

    //@XmlElement 
    private String name; 
    //@XmlElement 
    private int age; 
    private String email; 

    public String getName() { 
     return name; 
    } 
    @XmlElement 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getAge() { 
     return age; 
    } 
    @XmlElement 
    public void setAge(int age) { 
     this.age = age; 
    } 
    public String getEmail() { 
     return email; 
    } 
    @XmlElement 
    public void setEmail(String email) { 
     this.email = email; 
    } 
} 

ビルドファイル: -

buildscript { 
    ext { 
     springBootVersion = '1.3.6.RELEASE' 
    } 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
    } 
} 

apply plugin: 'java' 
apply plugin: 'eclipse' 
apply plugin: 'spring-boot' 

jar { 
    baseName = 'demo' 
    version = '0.0.1-SNAPSHOT' 
} 
sourceCompatibility = 1.8 
targetCompatibility = 1.8 

repositories { 
    mavenCentral() 
} 


dependencies { 
    compile('org.springframework.boot:spring-boot-starter-aop') 
    compile('org.springframework.boot:spring-boot-starter-web') 
    compile('javax.xml.bind:jaxb-api:2.2.12') 
    testCompile('org.springframework.boot:spring-boot-starter-test') 
} 


eclipse { 
    classpath { 
     containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER') 
     containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8' 
    } 
} 

私が間違って何をやっています? ここのお手伝いが大変ありがとうございます。

おかげで、あなたの要求はapplication/jsonに設定Acceptヘッダが含まれている必要があり、サーバからの応答jsonを得るために

+1

JAXBはJDKの一部です。その依存関係を追加する必要はありません。返される内容は、受け取り側のヘッダ(およびその順番)と呼び出し元のURL(.jsonや.xmlなどの拡張も返される内容に影響を与えます)によって決まります。ジャクソンがJAXBアノテーションを理解して、JAXBアノテーションに正しいJAXB依存関係を含める必要があります。 –

+0

ありがとう、私は答えとしてコメントを受け入れることができないので、私は以下を受け入れました。 –

答えて

5

アマール。

+0

これはうまくいきました、ありがとう、私はコンテンツヘッダーがトリックを行うように設定されたコンテンツタイプを考えていましたが、それはAcceptヘッダーでした。 –

3

JsonまたはXMLで応答を送信するには、Content Negotiation Strategyを使用する方法があります。あなたは/person.jsonや/person.xmlのようなURLを使うことができます。これらはjsonまたはxml応答を生成します。お使いのコントローラに追加する

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 

     public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { 
     configurer.favorPathExtension(false). 
       favorParameter(true). 
       parameterName("mediaType"). 
       ignoreAcceptHeader(true). 
       useJaf(false). 
       defaultContentType(MediaType.APPLICATION_JSON). 
       mediaType("xml", MediaType.APPLICATION_XML). 
       mediaType("json", MediaType.APPLICATION_JSON); 
     } 
    } 

必要は生じ= {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE}:しかし、最初に、あなたはあなたのメインスプリングのブートクラスを設定する必要があります。 Here is an example 希望します。

+0

この情報をありがとう、私もこれを試してみます –

+0

これも動作します!!!!!! –

+0

素晴らしい。あなたを助けてくれてうれしい – Pracede

関連する問題