В чем разница между ResponseEntity <T> и @ResponseBody?

У меня есть простой обработчик в моем контроллере, который возвращает сообщение

@RequestMapping(value = "/message")
@ResponseBody
public Message get() {
    return new Message(penguinCounter.incrementAndGet() + " penguin!");
}

В то же время я могу использовать что-то вроде этого

@RequestMapping(value = "/message")
ResponseEntity<Message> get() {
    Message message = new Message(penguinCounter.incrementAndGet() + " penguin!");
    return new ResponseEntity<Message>(message, HttpStatus.OK);
}

В чем разница между этими двумя подходами? Не учитывайте HttpStatus:)

Ответ 1

ResponseEntity даст вам дополнительную гибкость при определении произвольных заголовков HTTP-ответов. См. Здесь 4-й конструктор:

http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/http/ResponseEntity.html

ResponseEntity(T body, MultiValueMap<String,String> headers, HttpStatus statusCode) 

Список возможных заголовков HTTP-ответов доступен здесь:

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses

К числу наиболее часто используемых относятся Status, Content-Type и Cache-Control.

Если вам это не нужно, использование @ResponseBody будет немного более кратким.