복붙노트

[SPRING] @GetMapping은 Accept가 정의 된 경우에도 호출됩니다.

SPRING

@GetMapping은 Accept가 정의 된 경우에도 호출됩니다.

나는 Spring Framework 4.3.13과 함께 일하고있다.

나머지는 POST에 대해 다음과 같습니다.

@Controller
@RequestMapping(path="/personas")
public class PersonaRestController {

    @PostMapping(consumes={MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE})
    public ResponseEntity<Void> saveOne(
            @Validated @RequestBody Persona persona, ...

JUnit 및 ResultActions로 작업하는 테스트 정보 java.lang.AssertionError : No handler 오류 메시지가 표시 될 수 있으며 다음을 확인하십시오.

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /personas
       Parameters = {}
          Headers = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.HttpMediaTypeNotSupportedException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 415
    Error message = null
          Headers = {Accept=[application/xml, application/json;charset=UTF-8]}
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

saveOne 메소드가 컨텐츠 데이터가 XML 또는 JSON이 될 것으로 예상하고이 테스트 시나리오에서 Content-Type이 전송되지 않았기 때문에이 동작을 감지 할 수 있습니다.

따라서 Spring은 HttpMediaTypeNotSupportedException 인스턴스를 생성 할 것으로 예상됩니다. 그런 다음 @Test 메소드가 실패하고 java.lang.AssertionError : 핸들러 오류 메시지가 표시됩니다. 사용자 요청을 처리 할 핸들러가 없기 때문입니다.

여기까지 OK.

다시 말하지만, Rest에 관해서는, GET을 위해, 나는 다음을 가지고있다 :

@GetMapping(path="/{id}",
            produces={MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE})
public @ResponseBody Persona findOneById(@PathVariable String id){
    return personaService.findOneById(id);
}

다음과 같은 다른 테스트 시나리오의 경우 :

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /personas/100
       Parameters = {}
          Headers = {}

Handler:
             Type = com.manuel.jordan.rest.persona.PersonaRestController
           Method = public com.manuel.jordan.domain.Persona com.manuel.jordan.rest.persona.PersonaRestController.findOneById(java.lang.String)

내 인터셉터는 다음 데이터를 보여줍니다.

HttpHeaderControlInterceptor - preHandle 
   HttpServletRequest > 
    URL: http://localhost/personas/100 
    URI: /personas/100 
       HttpMethod: GET 
          Accept: null 
          Accept-Language: null 
          Content-Type: null 

수락이 null 인 경우에도 findOneById 메서드가 처리기라고 불리는 이유가 혼란 스럽습니다. java.lang.AssertionError : No handler 오류 메시지와 HttpMediaTypeNotAcceptableException 클래스와 비슷한 것을 기대 했었습니다. 대신 findOneById 메소드가 XML 또는 JSON으로 데이터를 반환 할 수 있기 때문입니다.

없어진 물건 있어요?

해결법

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

    1.나는 완전히 확신 할 수는 없지만 HTTP 1.1,

    나는 완전히 확신 할 수는 없지만 HTTP 1.1,

    섹션 - 10.4.7 406 여기에서 허용되지 않음을 참조하십시오.

    나는 소비와 생산의 대우가 다르고 그 차이를 보는 이유라고 생각합니다.

    이 그래서 여기에 질문을 참조하십시오

    삭제하기 전에 답변을 게시했습니다. 기본적으로, 나는 당신의 질문을 오해했다.

  2. from https://stackoverflow.com/questions/48054312/getmapping-is-called-even-when-accept-is-defined-how-null by cc-by-sa and MIT license