Spring MVC 컨트롤러 메소드가 값을 반환하지 않으면 무엇을 반환합니까?


135

jQuery를 사용하여 $.getJSON()간단한 Spring MVC 백엔드에 대한 비동기 호출을 수행하고 있습니다. 대부분의 스프링 컨트롤러 메소드는 다음과 같습니다.

@RequestMapping(value = "/someURL", method = RequestMethod.POST)
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget,
    @RequestParam("type") String type) {
    return someDAO.getSomeData(widget, type);
}   

각 컨트롤러가 @ResponseBody클라이언트 측에서 기대하는 JSON을 JSON으로 반환하도록 설정했습니다 .

그러나 요청이 클라이언트 측에 콘텐츠를 반환하지 않으면 어떻게됩니까? 를 가질 수 있어요:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

그렇지 않은 경우 여기에서 사용하기에 적합한 구문은 무엇입니까?


당신이 아무것도 반환하지 않으면 다시 전송 된 내용이 없다고 생각합니까?
arahant

1
솔루션의 버전 1에서 "성공"부울 또는 이와 유사한 것을 래핑하더라도 POJO를 계속 반환한다고 생각합니다. 그럼 당신은 당신이 밝혀 경우에 빌드로 쉽게 일관된 모든 AJAX 방식의 패턴, 뭔가있어 반환 뭔가 필요!
millhouse

답변이 제안하는 것과는 달리, 두 번째 스 니펫에서 처음 가지고 있었던 것은 완벽하게 훌륭하고 POST데이터 를 처리하는 올바른 방법 입니다.
Brett Ryan

이 경우 null을 반환합니다. @RestController public class RESTControllerExample {@RequestMapping (value = "/ employees", method = RequestMethod.GET) public void getEmployeeNames () {EmployeeSource.getEmployees (); System.out.println ( "완료되었습니다"); }}
spandey

답변:


256

void를 반환하면 @ResponseBody가 필요없는 @ResponseStatus (value = HttpStatus.OK)로 메서드를 표시해야합니다.

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

get 메소드 만 200 상태 코드 내 재성을 리턴합니다.

  • void를 반환하고 메소드에 @ResponseStatus(value = HttpStatus.OK)
  • 객체를 반환하고 @ResponseBody
  • HttpEntity인스턴스 반환

2
그 사이에 런타임 예외가 발생하면 HTTP 500이 리턴되고 200이 아닌 리턴됩니다. 따라서 프론트 엔드 핸들 실패가 발생하면 예외 / 오류 메시지가 올바르게 표시됩니다.
Lee Chee Kiam

27
실제로 설정할 필요가 없으며 설정 @ResponseStatus하면 안됩니다. 간단히 가진 @ResponseBodyA의 void핸들러하는 미세에 충분하다.
Brett Ryan

11
void 메소드의 경우 200 대신 204 No Content를 반환하는 것이 좋습니다.
raspacorp

1
@raspacorp 200은 본문이 없으므로 POST에 적합합니다.
Brett Ryan

8
@BrettRyan은 주석처럼, 적어도 REST API의 경우 POST를 사용하여 컨텐츠를 작성하는 것이 일반적입니다.이 경우 일반적으로 작성된 엔터티, 전체 작성된 엔티티 또는 링크의 ID를 리턴합니다. 읽기 작업 컨텐츠가없는 200 상태 리턴은 REST API 관점에서 혼동 될 수 있습니다.
raspacorp

43

적절한 헤더를 사용하여 ResponseEntity를 간단히 반환 할 수 있습니다.

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){
....
return new ResponseEntity(HttpStatus.OK)
}

누군가 내가했던 것과 같은 문제가 발생하면 이전 버전의 스프링 (4.1.1)에서 작동하지 않았지만 500 오류가 발생합니다. 나는 4.2.0으로 업그레이드했고 이것은 훌륭하게 작동한다
소스 :

그것은 빈 200을 반환하는 가장 선호하는 방법입니다. Spring 4.1부터 빌더 패턴을 대신 사용하십시오. return ResponseEntity.ok (). build ();
GreenTurtle

3
컴파일하는 것처럼 보이지만 다음 경고가 표시됩니다.ResponseEntity is a raw type. References to generic type ResponseEntity<T> should be parameterized
Gonzalo.-

8

"ResponseEntity"개체를 반환 할 수 있습니다. "ResponseEntity"오브젝트를 사용하면 응답 오브젝트 (HTTP 응답 코드 및 HTTP 상태 코드 포함)를 구성 할 때와 응답 오브젝트에서 정보를 가져올 때 매우 편리합니다.

getHeaders (), getBody (), getContentType (), getStatusCode () 등의 메소드는 ResponseEntity 오브젝트 읽기 작업을 매우 쉽게 만듭니다.

http 상태 코드가 204 (No Content) 인 ResponseEntity 오브젝트를 사용해야합니다. 이는 요청이 올바르게 처리되었고 응답 본문이 의도적으로 비어 있음을 지정하기위한 것입니다. 적절한 상태 코드를 사용하여 올바른 정보를 전달하는 것은 특히 여러 클라이언트 응용 프로그램에서 사용할 API를 만드는 경우 매우 중요합니다.


3
브라우저에서 설정이 @ResponseStatus(HttpStatus.NO_CONTENT)해결 XML Parsing Error: no root element found되었습니다
aliopi

3

예, @ResponseBody를 void반환 유형 과 함께 사용할 수 있습니다 .

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseBody
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

1
반환 유형은 무엇입니까? HTTP 상태 코드입니까?
spandey

@techBeginner이 경우 200 (확인)입니다.
Lakatos Gyula

2

void를 반환하는 데 아무런 문제가 없으므로 요청 @ResponseBody해야 POST합니다.

다른 사람이 성공 상태를 언급하는 대신 HTTP 상태 코드를 사용하여 예외 핸들러 루틴 내에서 오류를 정의하십시오. 일반적인 메소드 200는 원하는 응답 코드 를 반환하고 예외 처리기는 오류 객체와 다른 코드 (예 :)를 반환 할 수 있습니다 500.


1

그러나 시스템의 크기와 기능이 커짐에 따라 항상 json을 반환하는 것은 전혀 나쁜 생각이 아니라고 생각합니다. 더 건축적인 / "큰 규모의 디자인"문제입니다.

코드와 데이터라는 두 가지 알려진 필드를 사용하여 항상 JSON을 복구하는 것에 대해 생각할 수 있습니다. 여기서 code는 수행 할 작업의 성공을 지정하는 숫자 코드이고 data는 요청 된 작업 / 서비스와 관련된 추가 데이터입니다.

우리가 백엔드 서비스 공급자를 사용할 때 모든 서비스가 제대로 작동하는지 확인할 수 있습니다.

그래서 나는 스프링이 이것을 관리하지 못하게하기 위해 하이브리드 반환 작업을 노출시킵니다 (일부는 다른 데이터를 반환하지 않습니다 ...). 하루가 끝나면 더 간단합니다.


0

다음은 비동기 메소드에 대해 수행 한 코드 예입니다.

@RequestMapping(value = "/import", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void importDataFromFile(@RequestParam("file") MultipartFile file) 
{
    accountingSystemHandler.importData(file, assignChargeCodes);
}

메소드에서 어떤 것도 반환 할 필요가 없습니다.이 주석을 사용해야하기 때문에 메소드는 모든 경우에 OK를 반환해야합니다.

@ResponseStatus(value = HttpStatus.OK)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.