2014-01-17 12 views
0

jquery-ajax가있는 jsp에서 POST 데이터를 Spring-MVC 컨트롤러 기능에 전달하려고합니다. 데이터가 잘 전달되고 String 객체를 사용하여 RequestBody을받을 때 JSON 데이터를 인쇄 할 수 있습니다. 하지만 컨트롤러는 다음과 같은 성명과 함께 '415 지원되지 않는 미디어 유형의 오류'를 반환 자신의 객체로 선언 된 목록 변수가있는 DTO를 사용하는 경우AJAX-Spring에서 지원되지 않는 미디어 유형 오류

서버는 요청 때문에이 요청을 거부 엔티티가 요청 된 메소드에 대해 요청 된 자원에서 지원되지 않는 형식입니다. 주어진 아래

는 DTO 클래스 지금

public class anyClassDTO{ 
      private String name; 
      private List<anyClassDTO> subList = new ArrayList<anyClassDTO>(); 

       //getters and setters here 
    } 

이며, 여기에 JSP 페이지로부터 수신되는 오브젝트의리스트

@RequestMapping(headers ={"Accept=application/json"}, value = "urlFromJsp", method = RequestMethod.POST) 
public @ResponseBody 
String addData (HttpServletRequest request, 
       @RequestBody List<anyClassDTO> dtoObject,  
       Model model) 
{  
    return "{\"value\":\"true\"}"; 
} 

가능으로되어 있지 않은 컨트롤러 함수 AJAX를 통해 컨트롤러? 여기

샘플 데이터의 세트가 JSP로 전달되는

[{ "이름" "모듈 1", "하위 목록": [{ "이름": "장", "하위 목록" {{ "name": "chapter1", "subList1", "subList1", "subList1", "subList1", "subList2" "이름": "subchapter1", "하위리스트"는 null}]}]}]

+0

내가 생각하는 문제에 대한 이상한 오류입니다.사용중인 Spring 버전을 제공하면 도움이 될 것입니다. –

+0

봄 버전은 3.1이고 Jackson Mapper 라이브러리는 2.3.0입니다. – evyavan

+0

@SotiriosDelimanolis 제가 생각하는 '그'문제는 무엇입니까? – evyavan

답변

1

이 있는지 확인 AJAX 요청을 설정하는 요청의 Content-Typeapplication/json합니다.

@RequestBody을 지정할 때 일반적으로 Spring은 요청 본문을 변환하기 위해 MappingJacksonHttpMessageConverter을 사용합니다. 이 HttpMessageConverterapplication/*+json 유형의 콘텐츠 유형 만 지원하므로 요청에 콘텐츠 유형이 포함되어 있는지 확인해야합니다.

+0

AJAX 호출에서 우리는 이미 다음을 설정하고 있습니다 _beforeSend : function (xhr) { xhr.setRequestHeader ("Accept", "application/json"); xhr.setRequestHeader ("Content-Type", "application/json"); } _ – evyavan

+0

@evyavan 게시물을 수정하고 AJAX를 추가하십시오. 나는 당신의 코드로 그것을 시도하고 작동합니다. 중간 DTO는 필요하지 않습니다. 로거가 디버그되도록 설정하여 Spring 버그가있는 곳을 확인할 수도 있습니다. –

0

글쎄, 우리는 조금 더 자세한 내용을 추가하여 그대로 작동시킬 수 있습니다. @ResponseBody를 List 객체로받는 대신에 원래 DTO의 List 객체를 보유하는 다른 DTO를 만들었습니다. 따라서 두 번째 DTO는 기본적으로 AJAX에서 단일 객체로 데이터를받는 더미입니다.

내가 질문에 말한 것처럼 내가에 DTO

위의 목록
public class DummyDTO{ 
     private List<AnyClassDTO> dummyObj; 

     //getters and setters here 
} 

을 다음 보유하고 다른 DTO를 만들어

public class AnyClassDTO{ 
     private String name; 
     private List<anyClassDTO> subList = new ArrayList<anyClassDTO>(); 

      //getters and setters here 

}

다음과 같이 나는 DTO가 컨트롤러를 기능을

@RequestMapping(headers ={"Accept=application/json"}, value = "urlFromJsp", method = RequestMethod.POST) 
public @ResponseBody 
String addData (HttpServletRequest request, 
      @RequestBody DummyDTO dummyDTOObj,  
      Model model) 
{  
     return "{\"value\":\"true\"}"; 
} 
으로 변경했습니다.

이전에 AJAX에서 직접 목록을 보내는 경우 전체 데이터를 보유하는 변수가 포함 된 문자열로 된 litteral을 보냈습니다.

그리고 그것은 매력처럼 작동합니다!

관련 문제