programing

Spring MVC에서 @ResponseBody를 사용할 때 MIME 유형 헤더를 설정하려면 어떻게 해야 합니까?

powerit 2023. 2. 27. 22:16
반응형

Spring MVC에서 @ResponseBody를 사용할 때 MIME 유형 헤더를 설정하려면 어떻게 해야 합니까?

JSON 문자열을 반환하는 Spring MVC 컨트롤러가 있는데 mimtype을 application/json으로 설정하려고 합니다.내가 어떻게 그럴 수 있을까?

@RequestMapping(method=RequestMethod.GET, value="foo/bar")
@ResponseBody
public String fooBar(){
    return myService.getJson();
}

비즈니스 오브젝트는 이미 JSON 문자열로 사용할 수 있으므로MappingJacksonJsonView나한테는 해결책이 안 돼 @ResponseBody완벽합니다만, mimtype을 설정하려면 어떻게 해야 하나요?

사용하다ResponseEntity대신ResponseBody이렇게 하면 응답 헤더에 액세스하여 적절한 콘텐츠유형을 설정할 수 있습니다.Spring 문서에 따르면:

HttpEntity와 유사하다@RequestBody그리고.@ResponseBody요청 및 응답 기관에 접근할 수 있는 것 외에HttpEntity(및 응답 고유의 서브클래스는ResponseEntity)는 요구 및 응답 헤더에 대한 접근도 허용합니다.

코드는 다음과 같습니다.

@RequestMapping(method=RequestMethod.GET, value="/fooBar")
public ResponseEntity<String> fooBar2() {
    String json = "jsonResponse";
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.setContentType(MediaType.APPLICATION_JSON);
    return new ResponseEntity<String>(json, responseHeaders, HttpStatus.CREATED);
}

JSON 문자열이 아닌 도메인 오브젝트를 반환하고 Spring이 (를 통해) 시리얼화를 처리하도록 서비스를 리팩터링하는 것을 검토하겠습니다.MappingJacksonHttpMessageConverter기입해 주세요).Spring 3.1에서는 구현이 매우 깔끔해 보입니다.

@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE, 
    method = RequestMethod.GET
    value = "/foo/bar")
@ResponseBody
public Bar fooBar(){
    return myService.getBar();
}

코멘트:

일단은<mvc:annotation-driven />또는@EnableWebMvc응용 프로그램 구성에 추가해야 합니다.

다음으로 는 의 Atribute를 생성합니다.@RequestMapping주석은 응답의 내용 유형을 지정하는 데 사용됩니다.따라서 MediaType으로 설정해야 합니다.APPLICATION_JSON_VALUE(또는"application/json").

마지막으로 잭슨은 Java와 JSON 사이의 모든 시리얼화와 디시리얼라이제이션이 스프링에 의해 자동으로 처리되도록 추가해야 합니다(잭슨의 의존성은 스프링 및MappingJacksonHttpMessageConverter후드 아래에 있을 것)

@ResponseBody에서는 할 수 없지만 다음과 같은 기능이 있습니다.

package xxx;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class FooBar {
  @RequestMapping(value="foo/bar", method = RequestMethod.GET)
  public void fooBar(HttpServletResponse response) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    out.write(myService.getJson().getBytes());
    response.setContentType("application/json");
    response.setContentLength(out.size());
    response.getOutputStream().write(out.toByteArray());
    response.getOutputStream().flush();
  }
}

이건 불가능할 것 같아.오픈 지라가 있는 것 같습니다.

SPR-6702: @ResponseBody에서 응답 Content-Type을 명시적으로 설정

등록하세요org.springframework.http.converter.json.MappingJacksonHttpMessageConverter메시지 변환기로서 개체를 메서드에서 직접 반환합니다.

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  <property name="webBindingInitializer">
    <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"/>
  </property>
  <property name="messageConverters">
    <list>
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    </list>
  </property>
</bean>

컨트롤러:

@RequestMapping(method=RequestMethod.GET, value="foo/bar")
public @ResponseBody Object fooBar(){
    return myService.getActualObject();
}

여기에는 의존관계가 필요합니다.org.springframework:spring-webmvc.

난 네가 할 수 있다고 생각하지 않아response.setContentType(..)

내 버전의 현실.HTML 파일을 로드하여 브라우저로 스트리밍합니다.

@Controller
@RequestMapping("/")
public class UIController {

    @RequestMapping(value="index", method=RequestMethod.GET, produces = "text/html")
    public @ResponseBody String GetBootupFile() throws IOException  {
        Resource resource = new ClassPathResource("MainPage.html");
        String fileContents = FileUtils.readFileToString(resource.getFile());
        return fileContents;
    }
}

언급URL : https://stackoverflow.com/questions/4471584/in-spring-mvc-how-can-i-set-the-mime-type-header-when-using-responsebody

반응형