Springを使用した開発者は、@RequestBodyと@ResponseBody Annotationsを使用しており、JSONへの入力とJSONへの出力を直接解析できると思います。ただし、HTTPリクエストと応答はテキストベースです。つまり、ブラウザとサーバーは元のテキストを交換して通信します。
httpmessageconverter
HTTP要求応答パケットは実際には文字列です。要求メッセージがJavaプログラムに入力されると、ServletinputStreamストリームにカプセル化されます。開発者はメッセージを読み取り、応答パケットはServletOutputStreamストリームを介して応答パケットを出力します。
ストリームから読み取ることができる元の文字列パケットのみが、出力ストリームにも同じことが言えます。次に、メッセージがSpringMVC/Springbootに到着し、SpringMVC/Springbootから出ると、文字列をJavaオブジェクトに変換する問題があります。このプロセスは、SpringMVC/Springbootで、httpmessageConverterを介して解決されます。 httpmessageconverterインターフェイスソースコード:
パブリックインターフェイスhttpmessageconverter <t> {boolean canread(class <?> clazz、mediatype mediatype); Boolean Canwrite(class <?> clazz、mediatype mediatype);リスト<Mediatype> getSupportedmediatypes(); t read(class <?clazz、httpinputmessage inputmessage)は、ioexception、httpmessagenotreadableexceptionをスローします。 void write(t t、mediatype contentType、httpoutputmessage outputmessage)IoException、httpmessagenotwritexception;}説明する例は次のとおりです。
@RequestMapping( "/test")@ResponseBodyPublic String test(@RequestBody String param){return "param '" + param + "'";}リクエストがテスト方法に入る前に、対応するhttpmessageconverterの実装クラスが@requestbodyアノテーションに従って選択され、リクエストパラメーターをパラメーター変数に解析します。ここのパラメーターは文字列であるため、stringhttpmessageconverterクラスはここで使用されます。そのcanread()メソッドはtrueを返し、その後、read()メソッドはリクエストからリクエストパラメーターを読み取り、test()メソッドのparam変数にバインドします。
同様に、テストメソッドが実行されると、戻り値が@ResponseBodyを識別するため、SpringMVC/SpringBootはstringhttpmessageconverterのwrite()メソッドを使用し、結果を応答メッセージの文字列値として書き込みます。もちろん、CANWRITE()メソッドは現時点でTRUEを返します。
次の図を借りて、プロセス全体を簡単に説明します。
春の処理中、要求メッセージと応答メッセージがそれぞれリクエストメッセージhttpinputmessageと応答メッセージhttpoutputmessageに抽象化されます。
要求を処理するとき、適切なメッセージコンバーターは、要求メッセージをメソッドの正式なパラメーターオブジェクトにバインドします。ここでは、JSONやXMLなど、同じオブジェクトに複数の異なるメッセージフォームがある場合があります。リクエストへの応答にも同じことが言えます。
春には、さまざまなメッセージフォームの場合、さまざまなメッセージフォームを処理するための異なるhttpmessageconverterの実装クラスがあります。さまざまなメッセージ解析のさまざまな実装に関しては、異なるhttpmessageconverterの実装クラスにあります。
@ResponseBodyのデフォルトのhttpmessageconverterを交換します
スプリングブートの例です。 SpringMVC/Springbootでは、@RequestBody AnnotationはJacksonを使用してデフォルトでJSONを解析します。次の例を参照してください。
@controller @requestmapping( "/user")public class usercontroller {@requestmapping( "/testt")@responsebody public user testt(){user user = new user( "name"、18);ユーザーを返します。 }}パブリッククラスユーザー{private string username;民間整数年齢;プライベート整数電話;プライベート文字列メール;パブリックユーザー(String username、integer age){super(); this.username = username; this.age = age; }}ブラウザアクセス /ユーザー /テストは次のように返されます。
これは、ジャクソンの解析を使用した結果です。次に、FastJSON解析オブジェクトを使用するように変更します。ここでは、デフォルトのhttpmessageconverterを置き換えます。これは、fastjsonhttpmessageconverterを使用してJavaオブジェクトとhttpinputmessage/httpoutputmessage間の変換を処理することを意味します。
まず、Configuration FastJSonHTTPMESSAGECONVERTERを追加する新しい構成クラスを作成します。 Spring 4.Xでは、Java Configuration Annotationメソッドを使用することをお勧めします。つまり、XMLファイルはなく、Springbootはさらにそうです。
com.alibaba.fastjson.serializer.serializerfeature; Import com.alibaba.fastjson.support.config.fastjsonconfig; Import com.alibaba.fastjson.support.spring.fast.fastjsonhttpmessageConverter; Import; springframework.boot.autoconfigure.web.httpmessageconverters; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; Import org.springframework.http.converter.httppecenter. java.nio.charset.charset; @configurationpublic class httpmessageconverterconfig {// fastjsonを紹介してデフォルトのジャクソンを使用しないでください。 fastjsonhttpmessageconverters(){// 1。メッセージを変換するオブジェクトを定義しますfastjsonhttpmessageconverter fastConverter = new fastjsonhttpmessageconverter(); // 2。 FastJSON構成情報FastJSonConfig FastJSonConfig = new FastJSonConfig()を追加する; serializerfeature [] serializerfeatures = new serializerfeature [] {//出力キーは二重Quoteですserializerfeature.writenullnumberaszero、//リストフィールドがnullの場合、出力は[]、null serializerfeature.writenulllistasemptyではなく[]ではありません。 serializerfeature.writenullbooleanasfalse、// date converter serializerfeature.writedatedateateformat、// circular reference serializerfeature.disablecircularrecedencedEctect、}; fastjsonconfig.setserializerfeatures(serializerfeatures); fastjsonconfig.setcharset(charset.forname( "utf-8")); // 3。 convert fastConverter.setfastjsonConfig(fastjsonconfig)にConvert fastConverter.set FastJsonConfig)に構成情報を追加します。 // 4。コンバージョンを追加するhttpmessageconverter <?> converter = fastConverter;新しいhttpmessageconverters(converter)を返します。 }}ここで、文字列タイプの値がnullの場合、「nullの値」が戻り、アプリケーションを再起動し、 /user /testtインターフェイスに再度アクセスし、次のように戻り、次のように戻ります。
NULLがこの時点で「または0に変換されていることがわかります。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。