Spring을 사용한 개발자는 @requestbody 및 @ResponseBody 주석을 사용했으며 입력을 JSON으로 직접 구문 분석하고 JSON으로의 출력을 직접 구문 분석 할 수 있다고 생각합니다. 그러나 HTTP 요청 및 응답은 텍스트 기반이므로 브라우저와 서버가 원본 텍스트를 교환하여 통신한다는 것을 의미하며 실제로 HTTPMESSAGECONVERTER는 역할을 수행합니다.
httpmessageconverter
HTTP 요청 응답 패킷은 실제로 문자열입니다. 요청 메시지가 Java 프로그램에 입력되면 ServletinputStream 스트림으로 캡슐화됩니다. 개발자는 메시지를 읽고 응답 패킷은 ServletOutputStream 스트림을 통해 응답 패킷을 출력합니다.
원래 문자열 패킷 만 스트림에서 읽을 수 있으며 출력 스트림에 대해서도 마찬가지입니다. 그런 다음 메시지가 SpringMVC/SpringBoot에 도착하여 SpringMVC/SpringBoot에서 종료되면 문자열을 Java 객체로 변환하는 데 문제가 있습니다. SpringMVC/SpringBoot 에서이 프로세스는 httpmessageconverter를 통해 해결됩니다. httpmessageconverter 인터페이스 소스 코드 :
공개 인터페이스 httpmessageconverter <t> {boolean canread (class <?> clazz, mediaType mediaType); 부울 canwrite (class <?> clazz, mediaType mediaType); getSupportedMediAtypes () 목록; t read (class <? extends t> clazz, httpinputmessage inputmessage)는 ioexception, httpmessagenoTreadableException; void write (t t, mediaType contenttype, httpoutputmessage outputmessage) ioexception, httpmessagenotwablexception;}다음은 설명 할 예입니다.
@requestmapping ( "/test")@responsebodypublic string test (@requestbody string param) {return "param" " + param +" ' ";}요청이 테스트 방법을 입력하기 전에 해당 HTTPMESSAGECONVERTER 구현 클래스는 @RequestBody 주석에 따라 선택하여 요청 매개 변수를 매개 변수로 구문 분석합니다. 여기의 매개 변수는 문자열이므로 StringhttpmessageConverter 클래스가 여기에서 사용됩니다. ITS CANREAD () 메서드는 true를 반환 한 다음 read () 메소드는 요청에서 요청 매개 변수를 읽고 test () 메소드의 매개 변수에 바인딩합니다.
마찬가지로, 테스트 방법이 실행될 때, 반환 값이 @ResponseBody를 식별하기 때문에 SpringMVC/SpringBoot는 stringhttpmessageConverter의 write () 메소드를 사용하고 결과를 문자열 값으로 응답 메시지에 씁니다. 물론 CanWrite () 메소드는 현재 TRUE를 반환합니다.
전체 프로세스를 간략하게 설명하려면 다음 수치를 빌려줍니다.
스프링 처리 중에 요청 메시지 및 응답 메시지가 요청 메시지 httpinputMessage 및 응답 메시지 httpoutputmessage로 추출됩니다.
요청을 처리 할 때 적절한 메시지 변환기는 요청 메시지를 메소드의 공식 매개 변수 개체에 바인딩합니다. 여기에는 JSON 및 XML과 같은 동일한 객체에 여러 다른 메시지 양식이있을 수 있습니다. 요청에 응답하는 것도 마찬가지입니다.
봄에는 다른 메시지 양식의 경우 다양한 메시지 양식을 처리하기위한 다른 httpmessageconverter 구현 클래스가 있습니다. 다양한 메시지 구문 분석의 다른 구현은 다른 httpmessageconverter 구현 클래스에 있습니다.
@responsebody의 기본 httpmessageconverter를 교체하십시오
다음은 SpringBoot의 예입니다. SpringMVC/SpringBoot에서 @RequestBody 주석은 Jackson을 사용하여 기본적으로 JSON을 구문 분석합니다. 다음 예를 참조하십시오.
@controller @requestmapping ( "/user") public class usercontroller {@requestmapping ( "/testt") @ResponseBody public user testt () {user user = new user ( "name", 18); 리턴 사용자; }} 공개 클래스 사용자 {개인 문자열 사용자 이름; 개인 정수 시대; 개인 정수 전화; 개인 문자열 이메일; 공개 사용자 (문자열 사용자 이름, 정수 에이지) {super (); this.username = username; this.age = age; }}브라우저 액세스 /user /testt는 다음과 같이 반환합니다.
이것은 잭슨 구문 분석을 사용한 결과입니다. 이제 우리는 그것을 Fastjson Parsing 객체 사용으로 변경합니다. 여기서 기본 httpmessageconverter를 교체합니다. 이는 Java 객체와 httpinputmessage/httpoutputmessage 간의 변환을 처리하기 위해 FastJsonhttpMessageConverter를 사용하는 것을 의미합니다.
먼저 구성 클래스를 작성하여 구성 FASTJSONHTTPMESAGECONVERTER를 추가하십시오. Spring 4.x는 Java 구성 주석 메소드를 사용하는 것이 좋습니다. 즉, XML 파일이 없으며 SpringBoot는 더욱 그렇습니다.
import com.alibaba.fastjson.serializer.serializerfeature; import com.alibaba.fastjson.support.config.fastjsonconfig; import com.alibaba.fastjson.support.spring.fastjsonhttpmessageconverter; import org.springframework.boot.autoconfigure.web.httpmessageconverters; import org.springframework.context.annotation.bean; import org.sprameframework.context.annotation.configuration; import org.springframework.http.contp.http.conteconver java.nio.charset.charset; @configurationpublic class httpmessageconverterconfig {// parse json에 fastjson을 소개하고, 기본 Jackson을 사용하지 마십시오. // fastjson jar 패키지는 pom.xml에 도입되어야하며, 1.2.10 @bean public httpmessageconverters 버전이어야합니다. fastjsonhttpmessageconverters () {// 1. 메시지를 변환하는 객체를 정의합니다. FASTJSONHTTPMESSAGECONVERTER FASTCONVERTER = NEW FASTJSONHTTPMESAGECONVERTER (); // 2. FASTJSON 구성 정보 추가 FASTJSONCONFIG FASTJSONCONFIG = NEW FASTJSONCONFIG (); SerializerFeature [] SerializerFeatures = New SerializerFeature [] {// 출력 키는 이중 인용문 // SerializerFeature.quotefieldNames.quotefieldNames, // 필드를 NULL로 출력할지 여부, NULL이면 필드가 표시되는 경우 // SerializerFeature.WritemApnullValue가 표시되는 경우 // 숫자 필드가 0 인 경우 0입니다. SerializerFeature.writenUllNumberAszero, // // 목록 필드가 NULL 인 경우, 출력은 [], null serializerfeature.writenUllListAsempty.writenUllListAsempty.writenUllListasEmpty, // 출력은 "" ", serializerfeature.writenullStringEmpty.writenUlstringSempty, //가 아닌 경우 NULL이 아닌 경우 출력은" ""입니다. SerializerFeature.WritenUllBooleanAsfalse, // 날짜 변환기 SerializerFeature.WritedateOidedAteFormat, // Circular Reference SerializerFeature.DisableCircularReferenceTect,}; FastJsonConfig.SetSerializerFeatures (SerializerFeatures); fastjsonconfig.setcharset (charset.forname ( "utf-8")); // 3. Convert FastConverter.setfastJsonConfig (FastJsonConfig)에서 구성 정보 추가; // 4. 변환에 변환 httpmessageconverter <?> converter = fastconverter; 새로운 httpmessageconverters (변환기)를 반환합니다. }}여기서 문자열 유형의 값이 NULL이면 "" ", NULL의 값이 0을 반환하고 응용 프로그램을 다시 시작하고 /User /Testt 인터페이스에 다시 액세스하고 다음과 같이 반환합니다.
현재 NULL이 ""또는 0으로 변환되어 있음을 알 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.