복붙노트

[SPRING] HttpMediaTypeNotAcceptableException / HttpMediaTypeNotAcceptableException : 허용되는 표현을 찾을 수 없습니다.

SPRING

HttpMediaTypeNotAcceptableException / HttpMediaTypeNotAcceptableException : 허용되는 표현을 찾을 수 없습니다.

클라이언트가 연결하려고하는 API가 있습니다. 그러나 그것은 오류를 throw합니다 :

2015 09 22 04:21:44.297 [org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor] Could not parse Accept header: Invalid token character ',' in token "json,application/x-www-form-urlencoded"
2015 09 22 04:21:44.298 [org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver] Resolving exception from handler [public org.springframework.http.ResponseEntity<java.lang.String> com.areviews.api.restcontroller.APIOrderController.getNewOrderApi(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
2015 09 22 04:21:44.298 [org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver] Invoking @ExceptionHandler method: public org.springframework.web.servlet.ModelAndView com.areviews.web.controller.AbstractController.handleException(java.lang.Exception,javax.servlet.http.HttpServletRequest)
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:115)
    at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:129)
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:74)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)

제어 장치:

@RequestMapping(value = {"order/add"}, method = RequestMethod.POST, produces="application/json; charset=utf-8")
@ResponseBody
public ResponseEntity<String> getNewOrderApi(HttpServletRequest request,
        HttpServletResponse response) throws Exception {

    .....

    return JsonUtils.createJson(jsonObj);
}

jQuery를 사용하여 API를 요청합니다.

    $.ajax({
            url: "https://api.mywebsite.com/apiv1/order/add",
            type: 'POST',
            beforeSend: function(xhr) {
                xhr.setRequestHeader("Content-Type","application/json;charset=utf-8");
            },
            data : JSON.stringify(data),
            dataType: 'json',
            success: function(data) {
                if (data.success == true){
                    console.log(data);
                }else{
                    console.log("error: " + data.error_description);
                }
            }
        });

문제는 요청 헤더에서 "Content-Type"입니다.

Accept:application/json, text/javascript, */*
Accept-Encoding:gzip, deflate
Accept-Language:zh,zh-TW;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:561
Content-Type:application/x-www-form-urlencoded, application/json;charset=UTF-8

우리는 "application / x-www-form-urlencoded"가 어디서 왔는지 ( ","는 ";"이어야하므로 문제를 만듭니다) 모릅니다. 내 편이 뭘 할 수 있니? 그들의 편에서 무엇을 할 수 있습니까?

해결법

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

    1.나는 또한 똑같은 문제에 직면했다.

    나는 또한 똑같은 문제에 직면했다.

    Volley를 사용하여 안드로이드에서 API를 공격하려고했습니다.

    2 가지 Content-Type이 있습니다. 하나는 요청 헤더 Content-Type이고 다른 하나는 Body Content-Type입니다. 발리에서 POST 또는 PUT 요청을 시작하면 발리는 요청 헤더를 가져 와서 Content-Type 본문을 확인합니다. 본문 Content-Type이 언급되지 않은 경우 발리는 단독으로 추가됩니다. Volley는 Content-Type과 우리 서버 모두를 하나의 Content-Type 만 허용 할 수 있습니다. 그러나 발리 슛이 Header와 Body에 대해 Content-Type을 결합하기 때문에 "application / json, application / x-www-form-urlencoded; charset = utf-8"이됩니다.

    여기서 "application / x-www-form-urlencoded"는 요청 본문에 대한 Content-Type입니다. 따라서이 문제를 해결하려면 getBodyContentType () 메서드를 재정 의하여 null을 반환 할 수 있습니다.

    @Override
    public String getBodyContentType() {
    //return super.getBodyContentType();
        return null;
    }
    

    ""반환을 사용하지 마십시오. return ""을 사용하면 예외가 발생합니다.

    [org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor] Could not parse Accept header: Invalid token character ',' in token "json, "
    

    희망이 도움이 될 것입니다.

  2. from https://stackoverflow.com/questions/32709072/httpmediatypenotacceptableexception-httpmediatypenotacceptableexception-could by cc-by-sa and MIT license