Retorne apenas a mensagem de string do Controlador Spring MVC 3

93

Alguém pode me dizer como posso retornar uma mensagem de string do controlador?

Se eu apenas retornar uma string de um método de controlador, então spring mvc tratando-a como um nome de exibição jsp.

user960567
fonte

Respostas:

191

Anote seu método no controlador com @ResponseBody:

@RequestMapping(value="/controller", method=GET)
@ResponseBody
public String foo() {
    return "Response!";
}

De: 15.3.2.6 Mapeando o corpo da resposta com a @ResponseBodyanotação :

A @ResponseBodyanotação pode ser colocada em um método e indica que o tipo de retorno deve ser escrito diretamente no corpo da resposta HTTP (e não colocado em um modelo ou interpretado como um nome de visão).

Tomasz Nurkiewicz
fonte
27
Para deixar mais claro, eu adicionaria @RequestMapping(value="/controller", method=GET, produces="text/plain")
makes
A verdadeira resposta está sempre nos comentários.
Johannes Stadler
48

Com o Spring 4, se o seu controlador for anotado com em @RestControllervez de @Controller, você não precisa da @ResponseBodyanotação.

O código seria

@RestController
public class FooController {

   @RequestMapping(value="/controller", method=GET)
   public String foo() {
      return "Response!";
   }

}

Você pode encontrar o Javadoc para @RestController aqui

geoand
fonte
Obrigado, isso me ajudou a descobrir que eu precisava usar \ @Controller em vez de \ @RestController para retornar uma visão, em vez de uma String.
khriskooper
@khriskooper fico feliz em saber disso :)
geoand
18

Embora @Tomasz esteja absolutamente certo, há outra maneira:

@RequestMapping(value="/controller", method=GET)
public void foo(HttpServletResponse res) {
    try {       
        PrintWriter out = res.getWriter();
        out.println("Hello, world!");
        out.close();
    } catch (IOException ex) { 
        ...
    }
}

mas o primeiro método é preferível. Você pode usar este método se quiser retornar uma resposta com tipo de conteúdo personalizado ou tipo binário de retorno (arquivo, etc ...);

danny.lesnik
fonte
Apenas um aviso, mas você nem precisa puxar a resposta para isso.
Scott,
Significa que, para o segundo ponto, sobre a necessidade de definir um tipo de conteúdo customizado ou retornar um tipo binário, você ainda pode usar o ResponseEntity para esses meios.
Scott,
6

Esta é apenas uma nota para aqueles que podem encontrar esta pergunta mais tarde, mas você não precisa puxar a resposta para alterar o tipo de conteúdo. Aqui está um exemplo abaixo para fazer exatamente isso:

@RequestMapping(method = RequestMethod.GET, value="/controller")
public ResponseEntity<byte[]> displayUploadedFile()
{
  HttpHeaders headers = new HttpHeaders();
  String disposition = INLINE;
  String fileName = "";
  headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

  //Load your attachment here

  if (Arrays.equals(Constants.HEADER_BYTES_PDF, contentBytes)) {
    headers.setContentType(MediaType.valueOf("application/pdf"));
    fileName += ".pdf";
  }

  if (Arrays.equals(Constants.HEADER_BYTES_TIFF_BIG_ENDIAN, contentBytes)
      || Arrays.equals(Constantsr.HEADER_BYTES_TIFF_LITTLE_ENDIAN, contentBytes)) {
    headers.setContentType(MediaType.valueOf("image/tiff"));
    fileName += ".tif";
  }

  if (Arrays.equals(Constants.HEADER_BYTES_JPEG, contentBytes)) {
    headers.setContentType(MediaType.IMAGE_JPEG);
    fileName += ".jpg";
  }

  //Handle other types if necessary

  headers.add("Content-Disposition", , disposition + ";filename=" + fileName);
  return new ResponseEntity<byte[]>(uploadedBytes, headers, HttpStatus.OK);
}
Scott
fonte
3

A respeito:

PrintWriter out = response.getWriter();
out.println("THE_STRING_TO_SEND_AS_RESPONSE");
return null;

Este woks para mim.

Dimitris
fonte
3

Para saída Stringcomo text/plainuso:

@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
    return "bar";
}
MariuszS
fonte
1
Isso não funcionou para mim. Tive que obter o objeto de resposta e definir explicitamente o tipo de conteúdo antes de retornar o objeto String.
Pedro Madrid