내용 협상 & 메시지 변환

5473 단어
여기서 저는 "클라이언트가 서버가 원하는 내용 유형을 알려줄 책임이 있습니다"ResponseBody 디코딩 문제를 논의했습니다. 그러면 이제 내용 협상과 메시지 전환이 무엇인지 보겠습니다.ContentNegotiatingViewResolver Implementation of ViewResolver that resolves a view based on the request file name or Accept header. ViewResolver는 요청 파일 이름이나 Accept 헤더를 기반으로 뷰를 해석합니다.
The ContentNegotiatingViewResolver does not resolve views itself, but delegates to other ViewResolvers. By default, these other view resolve rs are picked up automatically from the application context, though they can also be set explicitly by using the viewResolvers property. Not e that in order for this view resolver to work properly, the order property needs to be set to a higher precedence than the others (the defa ult is Ordered.HIGHEST_PRECEDENCE). ContentNegotiatingViewResolver는 뷰를 자체적으로 해석하지 않고 다른 ViewResolver에 의뢰합니다.기본적으로 이 다른 보기 해상도는 프로그램 상하문에서 자동으로 선택됩니다. 비록viewResolvers 속성을 사용하여 현시적으로 설정할 수 있습니다.이 보기 해상도가 정상적으로 작동하려면 order 속성을 다른 속성보다 높은 우선 순위로 설정해야 합니다(기본 속성은 Orde red.HIGHEST_PRECEDENCE).
This view resolver uses the requested media type to select a suitable View for a request. The requested media type is determined through the configured ContentNegotiationManager. Once the requested media type has been determined, this resolver queries each delegate view resolver for a View and determines if the requested media type is compatible with the view's content type). The most compatible view is returned. 이 보기 해상도는 요청한 미디어 형식을 사용하여 요청에 맞는 보기를 선택합니다.구성된 ContentNegotiationManager를 통해 요청된 미디어 유형을 결정합니다.요청한 미디어 형식을 확인하면 이 해상도는 모든 위탁 보기 해상도에 보기를 조회하고 요청한 미디어 형식이 보기의 내용 형식과 호환되는지 확인합니다.가장 호환되는 보기를 되돌려줍니다.
Additionally, this view resolver exposes the defaultViews property, allowing you to override the views provided by the view resolvers. Note that these default views are offered as candidates, and still need have the content type requested (via file extension, parameter, or Accept header, described above). 또한 이 보기 해상도는 defaultViews 속성을 공개하여 보기 해상도가 제공하는 보기를 덮어쓸 수 있습니다.이러한 기본 보기는 후보자로 제공되며, 요청한 내용 형식이 있어야 합니다. (파일 확장자, 파라미터 또는 헤더를 통해 위에서 설명한 바와 같이)
For example, if the request path is/view.html, this view resolver will look for a view that has the text/html content type (based on the ht ml file extension). A request for/view with a text/html request Accept header has the same result. 예를 들어, 요청 경로가/view인 경우.html, 이 보기 해상도는text/html 내용 유형(html 파일 확장명 기반)을 가진 보기를 찾습니다.text/html request Accept 헤더가 있는/view 요청은 같은 결과를 가지고 있습니다.
이로써 내용 협상은 컨트롤러 선택, Context-Type 설정에 대한 보기 사용 방법이다
자주 쓰는 게 메시지 변환기도 있어요.
package emcat

import global
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.ApplicationContext
import org.springframework.context.annotation.Configuration
import org.springframework.context.event.ContextRefreshedEvent
import org.springframework.context.event.EventListener
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver

@Configuration
open class EventListener {
    @Autowired var mWebApplicationContext: ApplicationContext? = null

    @EventListener fun onStarted(event: ContextRefreshedEvent) {
        val requestMappingHandlerAdapter = mWebApplicationContext!!.getBean(RequestMappingHandlerAdapter::class.java);
        val messageConverters = requestMappingHandlerAdapter.getMessageConverters();
        val sb = StringBuilder(1024);
        sb.append("Spring  ${ messageConverters.size }  :
"); for (mc in messageConverters) { sb.append(mc::class.java.getCanonicalName()); sb.append("
"); } global.log(sb.toString()) } } /* Output: Spring 7 : org.springframework.http.converter.ByteArrayHttpMessageConverter org.springframework.http.converter.StringHttpMessageConverter org.springframework.http.converter.ResourceHttpMessageConverter org.springframework.http.converter.ResourceRegionHttpMessageConverter org.springframework.http.converter.xml.SourceHttpMessageConverter org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter */

<> 레코드:
@ResponseBody 메모는 Spring에 반환된 객체를 리소스로 클라이언트에게 보내고 이를 클라이언트가 받아들일 수 있는 표현 형식으로 변환해야 한다고 알려 줍니다.더 구체적으로 말하자면, Dispatcher Servlet은 요청의 Accept 헤더 정보를 고려하여 클라이언트에게 필요한 설명 형식의 메시지 변환기를 찾을 것이다.
import org.springframework.http.converter.StringHttpMessageConverter
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
...

@Configuration
@EnableWebMvc
open class ServletConfig : WebMvcConfigurer {
    override fun configureContentNegotiation(configurer: ContentNegotiationConfigurer) {
        configurer.defaultContentType(MediaType.APPLICATION_JSON_UTF8)
    }

    override fun configureMessageConverters(converters: MutableList>) {
        val stringmc = StringHttpMessageConverter(Charsets.UTF_8)
        stringmc.setWriteAcceptCharset(false)
        converters.add(stringmc)
        
        val jsonmc = MappingJackson2HttpMessageConverter()
        converters.add(jsonmc)
        global.log(" ")
    }
}

/*
Spring  2  :
org.springframework.http.converter.StringHttpMessageConverter
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
*/

좋은 웹페이지 즐겨찾기