2017-01-10 9 views
0

コントローラーで@ResponseBodyを使用してjsonオブジェクトを生成したいとします。ブラウザ側では次のようになっています:status 406 "このリクエストで特定されたリソースは、リクエスト" accept "ヘッダーに従って受け入れられない特性を持つレスポンスを生成することしかできません。私は1.7.4バージョンでjackson-core-asl & jackson-mapper-aslを使用していたSpring MVCとJSON - 406受け入れられない@Responsebody

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.anand</groupId> 
    <artifactId>AnandWebStore</artifactId> 
    <packaging>war</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>AnandWebStore Maven Webapp</name> 
    <url>http://maven.apache.org</url> 

<properties> 
     <spring.version>4.0.3.RELEASE</spring.version> 
     <hibernate.core>4.2.7.Final</hibernate.core> 
    </properties> 

<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
     <!-- Spring dependencies --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 


     <dependency> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-orm</artifactId> 
       <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-jms</artifactId> 
       <version>${spring.version}</version> 
     </dependency> 


     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.0.0.GA</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>4.0.2.GA</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
     </dependency> 


     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>1.5.6</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-fileupload</groupId> 
      <artifactId>commons-fileupload</artifactId> 
      <version>1.3</version> 
     </dependency> 

     <dependency> 
       <groupId>org.hibernate</groupId> 
       <artifactId>hibernate-core</artifactId> 
       <version>${hibernate.core}</version> 
     </dependency> 

     <dependency> 
      <groupId>com.microsoft.sqlserver</groupId> 
      <artifactId>sqljdbc4</artifactId> 
      <version>4-2.0</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jsp-api</artifactId> 
      <version>2.0</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.webflow</groupId> 
      <artifactId>spring-js-resources</artifactId> 
      <version>2.4.1.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-core-asl</artifactId> 
      <version>1.7.4</version> 
     </dependency> 

     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>1.7.4</version> 
     </dependency> 



    </dependencies> 
    <build> 
    <finalName>AnandWebStore</finalName> 
    </build> 
</project> 

以下はpom.xmlファイルです。

以下は、コントローラにデータを送信するjspのコードです。以下は

<form:form class="well form-horizontal" action="saveCustomer.html" method="post" id="contact_form" commandName="customer"> 
     <fieldset> 

      <div class="form-group"> 
       <label class="col-md-4 control-label">First Name</label> 
       <div class="col-md-4 inputGroupContainer"> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span> 
         <form:input path="first_name" name="first_name" placeholder="First Name" class="form-control" type="text" /> 
        </div> 
       </div> 
      </div> 

      <div class="form-group"> 
       <label class="col-md-4 control-label" >Last Name</label> 
       <div class="col-md-4 inputGroupContainer"> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span> 
         <form:input path ="last_name" name="last_name" placeholder="Last Name" class="form-control" type="text" /> 
        </div> 
       </div> 
      </div> 

      <div class="form-group"> 
       <label class="col-md-4 control-label">E-Mail</label> 
       <div class="col-md-4 inputGroupContainer"> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span> 
         <form:input path="email" name="email" placeholder="E-Mail Address" class="form-control" type="text" /> 
        </div> 
       </div> 
      </div> 

      <div class="form-group"> 
       <label class="col-md-4 control-label">Phone #</label> 
       <div class="col-md-4 inputGroupContainer"> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="glyphicon glyphicon-earphone"></i></span> 
         <form:input path ="phone" name="phone" placeholder="(845)555-1212" class="form-control" type="text"/> 
        </div> 
       </div> 
      </div> 

      <div class="form-group"> 
       <label class="col-md-4 control-label">Address</label> 
        <div class="col-md-4 inputGroupContainer"> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="glyphicon glyphicon-home"></i></span> 
         <form:input path="address" name="address" placeholder="Address" class="form-control" type="text"/> 
        </div> 
       </div> 
      </div> 

      <div class="form-group"> 
       <label class="col-md-4 control-label">City</label> 
       <div class="col-md-4 inputGroupContainer"> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="glyphicon glyphicon-home"></i></span> 
         <form:input path="city" name="city" placeholder="city" class="form-control" type="text"/> 
        </div> 
       </div> 
      </div> 

      <div class="form-group"> 
       <label class="col-md-4 control-label">State</label> 
       <div class="col-md-4 selectContainer"> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="glyphicon glyphicon-list"></i></span> 
         <form:select path="state" name="state" class="form-control selectpicker"> 
          <option value=" " >Please select your state</option> 
          <option>......</option> 
         </form:select> 
        </div> 
       </div> 
      </div> 

      <div class="alert alert-success" role="alert" id="success_message">Success <i class="glyphicon glyphicon-thumbs-up"></i> Customer Added Successfully...</div> 

      <div class="form-group"> 
       <label class="col-md-4 control-label"></label> 
       <div class="col-md-4"> 
        <button type="submit" class="btn btn-warning" >Add <span class="glyphicon glyphicon-send"></span></button> 
       </div> 
      </div> 

     </fieldset> 
    </form:form> 

ディスパッチャサーブレットのコードです:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    "> 

    <mvc:annotation-driven/> 
    <mvc:resources location="/resources/" mapping="/resources/**" /> 
    <context:component-scan base-package="com.anand" /> 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/WEB-INF/views/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
    </bean> 

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
     <property name="basename" value="/WEB-INF/messages" /> 
    </bean> 

</beans> 

私はここ<mvc:annotation-driven/>を使用しています。

package com.anand.controllers; 

import java.util.HashMap; 
import java.util.Map; 

import javax.validation.Valid; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.validation.BindingResult; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 

import com.anand.forms.CustomerForm; 
import com.anand.forms.LoginForm; 
import com.anand.model.Customer; 
import com.anand.services.CustomerService; 

@Controller 
public class CustomerController { 

    private static final Logger logger = LoggerFactory.getLogger(CustomerController.class); 

    @Autowired 
    private CustomerService customerService; 

    @RequestMapping(value="saveCustomer.html",method=RequestMethod.POST) 
    private @ResponseBody Map<String, Object>saveCustomer(@Valid Customer customer, BindingResult result) 
    { 
     if(result.hasErrors()) 
     { 

     } 
     boolean saveFlag = customerService.save(customer); 
     Map<String, Object> map = new HashMap<String, Object>(); 
     if(saveFlag==true) 
     { 
      map.put("status", 200); 
      map.put("Message", "Data for customer saved successfully"); 
     } 
     else 
     { 
      map.put("status", 500); 
      map.put("Message", "Error occured at server side"); 
     } 
     return map; 
    } 
} 

注:ここでは、UIからポストされたデータをDBに格納されて取得されていることを見ることができると私は同じに対して実行休止クエリを確認することができ、以下に

コントローラのためのコードであります

リクエストヘッダ:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding:gzip, deflate, br 
Accept-Language:en-US,en;q=0.8 
Cache-Control:max-age=0 
Connection:keep-alive 
Content-Length:126 
Content-Type:application/x-www-form-urlencoded 
Cookie:JSESSIONID=A343E5E9FBF5866A12CEC2703DD5A5AE 
Host:localhost:8080 
Origin:http://localhost:8080 
Referer:http://localhost:8080/AnandWebStore/forms/loginform.html 
Upgrade-Insecure-Requests:1 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 
私はbrwoserのネットワーク部分を分析し、情報の下に発見しただけでなく、コンソール日食が、UI側では、私は、エラー406 を取得していますstackoverflowのに質問ofseveralの回答から

私はこの問題は、以下の行であり、このヘッダは、アプリケーション/ JSONのようにする必要があることを知った:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 

はいそれは結構です。これを解決する方法は?

+0

jackson 1.7? check fasterxml jackson、それは現在2.8バージョンです。それとも、あなたはそれにこだわっていますか? – Walfrat

+0

あなたはフロントクライアントとして使用しますか?ブラウザ? – Walfrat

+0

@Walfratはいそれはブラウザです...私も応答本体をチェックするためにpostmanのchorme拡張子を使用しようとしました。 –

答えて

0

最後に、現在動作しています。最初に、同じことをするアプローチを変更しました。

$('#AddCustButton').click(function(){ 

     var firstName = $('#first_name').val(); 
     var lastName = $('#last_name').val(); 
     var email = $('#email').val(); 
     var phone = $('#phone').val(); 
     var address = $('#address').val(); 
     var city = $('#city').val(); 
     var state = $('#state').val(); 


     $.ajax({ 
      url:'saveCustomer', 
      type:'POST', 
      dataType:'json', 
      data:{'first_name':firstName,'last_name':lastName,'email':email,'phone':phone,'address':address,'city':city,'state':state}, 
      success:function(response){ 
       if(response.status=='Success'){ 
        $('#success_message').slideDown({ opacity: "show" }, "slow"); // Do something ... 
        $('#contact_form').data('bootstrapValidator').resetForm(); 
       } 
      } 
     }); 
    }); 

し、応答をチェックしかし、私はCodehusジャクソンを変更するための手がかりを得たステータスコード406.Thenと同じエラーを取得しました:今の代わりにフォームを使用しての私は以下のようにAjax呼び出しを使用しています提出@WalfratのコメントからfasterXmlジャクソンへのライブラリ(質問以下のコメントを参照)、それが働いているfasterXMLジャクソンにCodehausのジャクソンから変更した後、この質問 Question

に「ポール・汚れ」の答えから。

0

少し紛らわしいです - あなたはHTMLフォームのPOSTリクエストを送信し、JSONをレスポンスとして受け取りたいのですか?フォームやHTMLレスポンス、またはJSONでリクエスト全体を処理するかどうかを決定することをお勧めします。

本当にフォームを消費してJSON(私にとって意味をなさない)を作成したい場合は、XMLHttpRequestを使用してフォームを送信するか、jQueryなどの他のJSライブラリを使用して追加してくださいヘッダーはapplication/jsonです。 HTMLフォームを使用してJSONリクエストを送信することはできません。受け入れ可能なタイプがリストされていますhere

HTMLを消費したり、JSONを生成して消費することをお勧めします。 JSONをコントローラのパラメータの近くに@RequestBody注釈を追加することを忘れないでください。

return new ResponseEntity<Map<String, String>>(map, HttpStatus.OK); 
+0

アップデート:AJAXコールに切り替え、codehus-JacksonライブラリをfasterXml-jacksonライブラリに置き換えました。私は、この「http://stackoverflow.com/questions/7473498/spring-mvc-406-not-acceptable-instead-of-json-response」に対する「Paul grime」の答えからの手がかりを得ました。 " " MappingJacksonJsonの処理に関しては、Jackson ObjectMapperがあなたのオブジェクトタイプをサポートしていることを確認する必要があります。 " - >これからコードハスジャクソンの代わりにFasterXml-Jacksonを使用する手掛かりが得られました。もう一度あなたの助けをありがとう。 –

0

を役に立てば幸い

@RequestMapping(value = "saveCustomer.html", 
     method = RequestMethod.POST, 
     consumes= { "application/json" }, 
     produces = { "application/json" }) 
    public ResponseEntity<String> saveCustomer(@Valid Customer customer, BindingResult result) { 

    // your business logic here 

    if(saveFlag==true) { 
     return new ResponseEntity<String>("Data for customer saved successfully", HttpStatus.OK); 
    } 
    else { 
     return new ResponseEntity<String>("Error occured at server side", HttpStatus.INTERNAL_SERVER_ERROR);    
    } 

} 
0

はこのような何かを試してみてください:それは

@RequestMapping(value="saveCustomer.html",method=RequestMethod.POST) 
private @ResponseBody Map<String, Object>saveCustomer(@Valid @ReqyuestBody Customer customer, BindingResult result) 
{ .... 

ようになりますので、あなたはあなたのコントローラから代わりにResponseEntityを返す必要がある、あなたはJSONオブジェクトを返すようにしたい場合は、

+0

質問に答えるためにありがとう。しかし、私は同じを使用しようとしましたが、それは動作していません私はステータスコードを持っています - 415のデシジョン 'サーバーはこの要求を拒否しました要求されたメソッドで要求されたリソースによってサポートされていません。' –

0

あなたが必要なSubmitにHTML Form POSTを行っていると以下のように、

<form enctype='application/json'> 

enctype属性を定義するためにこれはあなたのユーザエージェントは、JSONレスポンスを処理できるようになります。

+0

こんにちは私は同じことを試みたが、それは私のために働いていなかった私はAJAXコールに切り替えて、fasterXml - jacksonライブラリにcodehusジャクソンライブラリを置き換え、それは私のために働くことを開始します。私は、この「http://stackoverflow.com/questions/7473498/spring-mvc-406-not-acceptable-instead-of-json-response」に対する「Paul grime」の答えからの手がかりを得ました。 " " MappingJacksonJsonの処理に関しては、Jackson ObjectMapperがあなたのオブジェクトタイプをサポートしていることを確認する必要があります。 " - >これからコードハスジャクソンの代わりにFasterXml-Jacksonを使用する手掛かりが得られました。もう一度あなたの助けに感謝します。 –

関連する問題