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.

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).


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


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 ...);


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);
}

3

A respeito:

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

Este woks para mim.


3

Para saída Stringcomo text/plainuso:

@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
    return "bar";
}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.