2017-01-16 7 views
1

RESTリクエストを処理するために、Spring MVC 4 Webプロジェクト(Mavenプロジェクト)を作成しようとしています。 HTTP受け入れがtext/htmlの場合は 、jsonの場合はapplication/jsonです(アプリケーション/ xmlの場合はXMLのような他の形式でも可能です)。Spring MVC、RESTFulリクエスト(json)とJSP(コンテンツネゴシエーション)

コントローラーとJSP(@RestControllerも使用しています)をセットアップしました。問題は、私がそれを働かせることができないということです。システムがJSPで正しく答えた場合、jsonサービスは動作しておらず、その逆もあります。 各表現のハンドラを設定する必要がありますか?

ありがとうございます。ユーザーをフォーマットするかを決定するには

+0

をあなたはREST要求を処理しようとするか、単にAJAXをしようとしていますリクエスト? jspを返すメソッドとJSONまたはXMLコンテンツを返す@ResponseBodyで注釈を付けたメソッドを持つ特定のコントローラを作成することができます –

+0

1つの休憩リクエスト(example.com/get/resourceIDなど)を持っていて、 web jsp、json xml ...)。コンテンツネゴシエーションに基づいて別のハンドラを設定するにはどうすればよいですか? – user9370976

答えて

1

が要求したContentNegotationStrategyに依存している、箱から出して使用可能なデフォルトの実装がありますが、あなたとコンテンツネゴシエーションを設定し、使用するには

を希望する場合、また、あなた自身を実装することができますHTTPメッセージコンバータを使用して春:

あなたは春のMVCでコンテントネゴシエーションを有効にする必要があります。

<bean id="cnManager" 
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="favorPathExtension" value="true"/> 
    <property name="ignoreAcceptHeader" value="true" /> 
    <property name="defaultContentType" value="application/json" /> 
    <property name="useJaf" value="false"/> 

    <property name="mediaTypes"> 
     <map> 
      <entry key="html" value="text/html" /> 
      <entry key="json" value="application/json" /> 
      <entry key="xml" value="application/xml" /> 
     </map> 
    </property> 
</bean> 

またはJavaを使用した設定:これはexempleある

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 


    @Override 
public void configureContentNegotiation(
      ContentNegotiationConfigurer configurer) { 
     configurer.favorPathExtension(true). 
      ignoreAcceptHeader(true). 
      useJaf(false). 
      defaultContentType(MediaType.TEXT_HTML). 
      mediaType("html", MediaType.TEXT_HTML). 
      mediaType("xml", MediaType.APPLICATION_XML). 
      mediaType("json", MediaType.APPLICATION_JSON); 
    } 
} 
+0

@RestControllerアノテーションを使ってこれをテストしましたが、application/jsonヘッダーでリソースを呼び出すとjsonが返されます。標準のtext/htmlヘッダーを使用して呼び出すと、JSPが存在していてもそれを見つけることができません。特定のハンドラを作成する必要がありますか? – user9370976

+0

これは通常、JSPページはContentNegotiatingViewResolverによって解決されます: "org.springframework.web.servlet.view.InternalResourceViewResolver"あなたはあなたの休憩サービスを絶望する必要があります!あなたのメソッドからビューを返す必要があります! –

+0

例がありますか? – user9370976

0

を:各URLの末尾のために得る... /クライアントと第2のクライアントJSONオブジェクトを返しますため 第一の方法は、client.jspページを返します。それぞれが終わり... /クライアント/ ID

@RequestMapping(value = "/client", method = RequestMethod.GET) 
public ModelAndView getClientPage(final HttpServletRequest request, 
     final Model model,final HttpSession session) { 
     // traitement 

    return new ModelAndView("client"); 
} 

@RequestMapping(value = "/clients/{id}", method = RequestMethod.GET) 
public @ResponseBody Client getClient(@pathVariable("id") long id) { 

    Client client = YourService.getClient(id); 

    return client; 
} 

ContentnegotiatingviewresolverのJava設定を取得:

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "com.yourbasepackage") 
public class AppConfig extends WebMvcConfigurerAdapter { 


    @Bean 
    public ViewResolver jspViewResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setViewClass(JstlView.class); 
     viewResolver.setPrefix("/WEB-INF/views/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 

} 
+0

ありがとう、しかし、私はすでにその時点で問題になっています...問題は、私のアプリケーションがHTTP受け入れヘッダに基づいて同じURLに異なるフォーマットで答えるべきだということです。例 - > URL:/ clients/123 Accept:text/htmlはJSPを返します。 URL:/ clients/123 Accept:application/jsonがjsonを返します。 – user9370976

関連する問題