programing

Spring MVC 3 컨트롤러에서 문자열 메시지만 반환

javaba 2023. 1. 29. 20:28
반응형

Spring MVC 3 컨트롤러에서 문자열 메시지만 반환

컨트롤러에서 문자열 메시지를 반환하는 방법을 알려 주실 수 있나요?

컨트롤러 메서드에서 문자열을 반환하기만 하면 jsp 뷰 이름으로 처리되는 spring mvc가 됩니다.

컨트롤러의 메서드에 주석을 붙입니다.@ResponseBody:

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

시작: 15.3.2.6 응답 본문과 주석 매핑:

@ResponseBody주석 [...]을(를) 메서드에 붙일 수 있으며 반환 유형을 HTTP 응답 본문에 직접 작성해야 함을 나타냅니다(모델에 배치하거나 보기 이름으로 해석하지 않음).

Spring 4에서는 컨트롤러에 다음과 같은 주석이 붙어 있는 경우@RestController대신@Controller는 필요 없습니다.@ResponseBody주석입니다.

암호는 다음과 같습니다.

@RestController
public class FooController {

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

}

다음 Javadoc을 찾을 수 있습니다.@RestController 여기서

@Tomasz가 절대적으로 옳습니다만, 다른 방법이 있습니다.

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

첫 번째 방법이 더 좋습니다.사용자 정의 내용 유형으로 응답을 반환하거나 이진 유형(파일 등)을 반환하려는 경우 이 방법을 사용할 수 있습니다.);

나중에 이 질문을 찾을 수 있는 사용자를 위한 참고 사항이지만, 내용 유형을 변경하기 위해 응답을 가져올 필요는 없습니다.이를 실현하기 위한 예를 다음에 제시하겠습니다.

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

그럼 어떻게 되는 거죠?

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

이거 나한테 딱이야.

출력용String~하듯이text/plain용도:

@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
    return "bar";
}
@Controller
public class HelloController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    ResponseEntity<String> sayHello() {
        return ResponseEntity.ok("Hello");
    }
}

가장 심플한 솔루션:

따옴표를 추가해 주세요.응답 타입이 어플리케이션/json으로 정의되어 있는데 Spring boot에 의해 자동 구현되지 않는 이유를 잘 모르겠습니다만, 동작은 훌륭합니다.

@PostMapping("/create")
public String foo()
{
    String result = "something"
    return "\"" + result + "\"";
}

두 가지 가능한 해결책이 있습니다.

  1. 사용하다@Controller그리고.@ResponseBodyHTML 페이지와 문자열 메시지를 조합하여 다양한 기능을 수행합니다.

    @Controller
    @RequestMapping({ "/user/registration"})
    public class RegistrationController {    
    @GetMapping
     public String showRegistrationForm(Model model) {
         model.addAttribute("user", new UserDto());
         return "registration"; //Returns the registration.html
     }
    
     @PostMapping
     @ResponseBody
     public String registerUserAccount(@Valid final UserDto accountDto, final HttpServletRequest request) {
         LOGGER.debug("Registering user account with information: {}", accountDto);
         return "Successfully registered" // Returns the string
     }
    
  2. 사용하다@RestControllerString 메시지를 반환합니다.이 경우 HTML 페이지를 반환하는 함수를 사용할 수 없습니다.

     @RestController
     @RequestMapping({ "/user/registration"})
     public class RegistrationController {
    
     @PostMapping
         public String registerUserAccount(@Valid @RequestBody final UserDto accountDto, final HttpServletRequest request) {
             LOGGER.debug("Registering user account with information: {}", accountDto);
             return "Successfully registered" // Returns the string
         }
    
@ResponseBody
@RequestMapping(value="/get-text", produces="text/plain")
public String myMethod() {
     return "Response!";
}
  • 보이시죠?@ResponseBody?

이 메서드는 일부 텍스트를 반환하고 뷰 등으로 해석하지 않는 것을 말합니다.

  • 보이시죠?produces="text/plain"?

이 방법은 메서드에서 반환되는 내용을 알려주기 때문에 모범 사례일 뿐입니다.

언급URL : https://stackoverflow.com/questions/7672858/return-only-string-message-from-spring-mvc-3-controller

반응형