2017-01-10 1 views
0

컨트롤러에서 @ResponseBody를 사용하여 json 개체를 생성하려고합니다. 하지만 브라우저 쪽에서 얻는 것은 다음과 같습니다. 상태 406 "이 요청으로 식별 된 리소스는 요청"accept "헤더에 따라 수용 할 수없는 특성을 가진 응답 만 생성 할 수 있습니다." 나는 1.7.4 버전으로 jackson-core-asl & jackson-mapper-asl을 사용했다스프링 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 코드의 일부입니다.

<?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/>을 사용하고 있습니다 :

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

아래는 디스패처 서블릿 코드입니다.

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

주 : 여기서 i는 UI에서 등록한 데이터를 DB에 저장 얻는 것을 볼 수 있으며, I는 동일한 대해 실행 Hibernate 질의를 볼 수 있습니다

컨트롤러 용 코드

요청 헤더 :

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 
,369을뿐만 아니라하지만, UI 측면에서 나는 내가 brwoser의 네트워크 부분을 분석하고 정보 아래에서 발견 한 오류 (406) 납니다 콘솔 일식 내가 문제가 아래 줄 것을 알게하고이 헤더는 응용 프로그램/JSON처럼해야 유래의 질문 ofseveral 답변에서 1,363,210

:

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 - 잭슨 라이브러리 (질문 아래 설명 참조) codehaus - 잭슨이 작동하고 fasterXML - 잭슨으로 변경 한 후이 질문에 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 호출로 전환하고 codeshus-Jackson 라이브러리를 fasterXml-jackson 라이브러리로 바꿨고 나를 위해 일하기 시작합니다. 나는 이것에 대한 'Paul grime'의 대답에서 단서를 얻었다. http://stackoverflow.com/questions/7473498/spring-mvc-406-not-acceptable-instead-of-json-response. " "MappingJacksonJson 프로세싱 측면에서 잭슨 ObjectMapper가 직렬화를 위해 객체 유형을 지원하는지 확인해야합니다. "-> 이것에서 codehus-Jackson 대신 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있는 decription '요청 엔터티 형식 때문에이 요청을 거부했습니다. 요청 된 메소드에 대해 요청 된 자원이 지원하지 않습니다.' –

0

당신이 필요로하는 Submit에 HTML Form POST을하고있는 것처럼 다음과 같이 당신의 사용자 에이전트가 JSON 응답을 처리 할 수 ​​

<form enctype='application/json'> 

, enctype 속성을 정의합니다.

+0

안녕하세요, 나는 그것을 시도했지만 AJAX 호출로 바꿨으며 fasterXml-jackson 라이브러리로 codehus-Jackson 라이브러리를 대체했으며 저에게 도움이되었습니다. 나는 이것에 대한 'Paul grime'의 대답에서 단서를 얻었다. http://stackoverflow.com/questions/7473498/spring-mvc-406-not-acceptable-instead-of-json-response. " "MappingJacksonJson 프로세싱 측면에서 잭슨 ObjectMapper가 직렬화를 위해 객체 유형을 지원하는지 확인해야합니다. "-> 이것에서 codehus-Jackson 대신 FasterXml-Jackson을 사용하는 단서가 있습니다. 다시 당신의 도움에 감사드립니다. –

관련 문제