복붙노트

[SPRING] Accept 헤더가 * / * 일 때 @ResponseBody가있는 Spring 반환 json은 HttpMediaTypeNotAcceptableException을 throw합니다.

SPRING

Accept 헤더가 * / * 일 때 @ResponseBody가있는 Spring 반환 json은 HttpMediaTypeNotAcceptableException을 throw합니다.

스프링 3.0.0을 사용하고 있습니다.

JSON에 직렬화하려는 객체를 반환하는 끝점이 있습니다. Accept : application / json으로 요청이 오면 제대로 작동합니다. 요청은 현재 * / *를 Accept 값으로 사용하고 있습니다. 불행히도 나는 요청에 대한 통제권이 없다. 그렇지 않으면 나는 그것을 바꿀 것이다. * / *를 수신하면 HttpMediaTypeNotAcceptableException 예외가 발생합니다.

이 accept 패턴을 application / json에 매핑하는 방법이 있습니까?

이것은 다른 질문과 매우 유사하지만 중요한 차이점은 Accept 헤더가 * / *이어야한다는 것입니다. Spring의 Json은 적절한 응답으로 해결되지 않습니다.

내 컨트롤러는 다음과 같습니다.

@RequestMapping(value = "/v1/endpoint", method = RequestMethod.POST)
@ResponseBody
public EndpointResponse runEndpoint(@RequestBody String jsonData) {

    ObjectMapper mapper = new ObjectMapper();
    EndpointRequest opRequest = null;
    EndpointResponse opResponse = null;

    try {

        opRequest = mapper.readValue(jsonData, EndpointRequest.class);

        //....do stuff



    } catch (JsonParseException e) {
        return handleException(opResponse, e);
    } catch (JsonMappingException e) {
        return handleException(opResponse, e);
    } catch (IOException e) {
        return handleException(opResponse, e);
    }

    return opResponse;
}

감사!

해결법

  1. ==============================

    1.오늘 내가 모은 모든 것에서이 문제를 해결할 수있는 2 가지 옵션이 있습니다.

    오늘 내가 모은 모든 것에서이 문제를 해결할 수있는 2 가지 옵션이 있습니다.

    @RequestMapping(value = "/v1/endpoint", method = RequestMethod.POST)
    public void runEndpoint(@RequestBody String jsonData,
    ServletResponse response) {
    
        ObjectMapper mapper = new ObjectMapper();
        EndpointRequest opRequest = null;
        EnpointResponse opResponse = null;
        StringWriter sw = new StringWriter();
    
        try {
    
            opRequest = mapper.readValue(jsonData, EndpointRequest.class);
    
            opResponse = ...do stff...
    
            mapper = new ObjectMapper();
    
            mapper.writeValue(sw, opResponse);
    
            response.setContentType("application/json");
            response.getOutputStream().write(sw.toString().getBytes());
    
            } catch (JsonParseException e) {
            handleException(opResponse, e, response);
            } catch (JsonMappingException e) {
            handleException(opResponse, e, response);
            } catch (IOException e) {
            handleException(opResponse, e, response);
        }
    }
    

    당신이 더 우아한 무엇이라도 있으면, 나는 그것을 보는 것을 좋아할 것이다!

  2. ==============================

    2.나는이 같은 문제에 직면했다. 더 우아한 것은 아니지만 내가 선택한 것은 문자열을 반환하고 개체를 Json 자신으로 변환하는 것입니다. Gson을 JSON 라이브러리로 사용하기로 결정했습니다.

    나는이 같은 문제에 직면했다. 더 우아한 것은 아니지만 내가 선택한 것은 문자열을 반환하고 개체를 Json 자신으로 변환하는 것입니다. Gson을 JSON 라이브러리로 사용하기로 결정했습니다.

    @Controller
    public class NewAbstractController  {
    
       @RequestMapping(value = "/simple", method = RequestMethod.GET)
       public @ResponseBody String SayHello()
       {
           Foo foo = new Foo();
           foo.Name = "Chris";
           foo.age = 30;
    
           Gson gson = new Gson();
           return gson.toJson(foo);
       }
    
       public class Foo implements Serializable
       {
           public String Name;
           public Integer age;
       }
    
    }
    
  3. ==============================

    3.이러한 종속성을 pom.xml에 포함하십시오.

    이러한 종속성을 pom.xml에 포함하십시오.

     <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.3</version>
     </dependency>
    
     <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.3</version>
      </dependency>
    
  4. from https://stackoverflow.com/questions/5315288/spring-returning-json-with-responsebody-when-the-accept-header-is-throws-ht by cc-by-sa and MIT license