Feignリモート呼び出しを使用した場合、プログレッシブオブジェクトの解決に失敗しました。


Feignリモート起動プログレッシブオブジェクトの起動に失敗しました。
最近はSpringCloudのマイクロサービスを構築する際に、Feignを使って時報を遠隔的に呼び出しても、オブジェクトに戻るには無参構造法がなく、他のパラメータを含む構造方法があります。
現地で自分で作ったマイクロサービスのカタログは大体次の通りです。まだ始まったばかりです。その後は徐々に最適化の反復を補充します。興味があるのはforkで住所を教えてください。
https://github.com/zhanghailang123/MyCloud
指導意見を与える。
  • Eureka:登録センターサービス端末は、Eureka登録センター
  • を採用する。
  • EurekaClientA:そのうちの一つはEurekaサーバーで、名前はちょっと気の向くままになっています。データ提供センターに相当します。ORMフレームドッキングデータベースをしばらく使用していません。該当データを書き込みました。今は練習して使うだけです。後でSpringJPAを使うことを考えています。Mb用が多すぎて
  • です。
  • FeignZ:feignモジュールは、負荷バランスを遠隔的に呼び出し、Hystrixの溶断機構を統合しています。もちろん、今は最も簡単なDemoしか作っていません。手触りを練習しています。
  • HystrixDashboard :Hystrix計器パネルは、現在のサーバ状況に注目してもいいです。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1iElFSJl-1610638015331)(使用Feign远程调用时,序列化对象失败.assets/clipboard.png)]
  • RibbonZ:主に負荷バランスとして使用され、起動時にEurekaClientAを起動して何度も異なるポート番号を指定して負荷バランスをテストします。一般的にはFeignで直接遠隔呼出しし、ribbonを内蔵しています。このdemoもテストのためのものです。
  • TurBineZ:クラスタの溶断状況を監視するために用いられる。
  • ZuulZ:ゲートウェイ
  • 在这里插入图片描述
    これから本題に入ります。
    シーン:Feignを使って、書き込みのためのデータサービスEurekaClientAをリモートで呼び出した場合、以下のようにエラーが発生しました。
    feignモジュールは以下の通りです
    在这里插入图片描述
    ここでは問題を再現するために、溶断ロジックを一時的に注釈します。

    エラーメッセージ:
    commenxml.jackson.databind.exc.InvalidDefinitionException:Canot construct instance of`org.example.pojo.Student`
    エラーの対象:org.example.pojo.Student次のように簡単なbeanオブジェクト:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SKoeb8Wz-1610638015338)(使用Feign远程调用时,序列化对象失败.assets/image-20210114230523431.png)]
    どうしてこの問題を報告しましたか?無参画関数が存在しないので、プログレッシブに失敗しました。
    疑問を持って間違ったところに入る:

    この場所です。canInstantiate()メソッドチェックが通っていません。ここで断点を打って真相を探ってみよう。

    この検証の内容は:

    つまり、無参画構造関数を検証します。呼び出されたstudentオブジェクトに無参画構造関数を加えると正常に呼び出されます。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iFpjTYoT-1610638015342)(使用Feign远程调用时,序列化对象失败.assets/image-20210114231909848.png)]
    コンストラクタは成功的に呼び出すことができます。***
    問題は大きな問題ではないですが、サービスを構築する過程で、親身になって、確実に参加してこそ、いろいろな奇異な問題を感じられます。このように自分で直接手を下してこそ、収穫が一番大きいです。
    Feignが遠隔呼び出しをする注意点
    feignを使っている間に問題があったので、ここで以下のようにまとめます。
    1.リモート呼び出しを行うアプリインターフェースを定義します。
    のメソッドパラメータリストのパラメータはすべて@Request Param("value")を入力しなければなりません。さもなければ、405の異常を呼び出します。これはcontrollerとは違って、controllerの方法はパラメータ名とフロントから入ってきたパラメータキーの対応だけで自動的にパラメータをバインドすることができます。
    複雑なタイプは必ず@Request Bodyを付けます。
    2.serviceマイクロサービスにおけるControllerのパラメータバインディング
    パラメータリストに複雑なタイプがある場合は、Post要求を使用して、Get要求を使用して、Bad Requestエラーを報告し、@Request Body注釈を打つ必要がありますが、普通の基本タイプは@Request Param注釈を付けなくてもいいです。自動バインディングパラメータは自動的に登録できます。
    他の問題があれば、追加も歓迎します。コードを入れてください。
    app:
    
    @FeignClient("MS-ADMIN-SERVICE")
    public interface FixFeignService {
        @GetMapping("/fix")
        public List<FixInfo> findAll();
        @PostMapping("/fix/add")
        public int insert(@RequestBody FixInfo fixInfo);
        @PostMapping("/fix/limitByParam")
        public LayUIPageBean limitByParam(@RequestBody FixInfo fixInfo, @RequestParam("page") Integer page, @RequestParam("limit") Integer limit);
        @PostMapping("/fix/delByIds")
        public boolean delByIds(@RequestParam("ids[]") Long[] ids);
        @GetMapping("/fix/findById")
        public FixInfo findById(@RequestParam("id") Long id);
        @PostMapping("/fix/update")
        boolean update(@RequestBody FixInfo fixInfo);
    }
    
    サービス
    
    @RestController
    @RequestMapping("/fix")
    @Slf4j
    public class FixInfoController {
        @Autowired
        private FixInfoService fixInfoService;
        @GetMapping("")
        public List<FixInfo> findAll(){
            List<FixInfo> all = fixInfoService.findAll();
            return all;
        }
        @PostMapping("/add")
        public int insert(@RequestBody FixInfo fixInfo){
            return fixInfoService.insert(fixInfo);
        }
        @PostMapping("/limitByParam")
        public LayUIPageBean limitByParam(@RequestBody FixInfo fixInfo,Integer page,Integer limit){
            LayUIPageBean layUIPageBean = new LayUIPageBean();
            PageHelper.startPage(page,limit);
            List<FixInfo> all = fixInfoService.findByParam(fixInfo);
            PageInfo<FixInfo> pageInfo = new PageInfo<>(all);
            return layUIPageBean.setCount((int)pageInfo.getTotal()).setData(pageInfo.getList());
        }
        @PostMapping("/delByIds")
        public boolean delByIds(@RequestParam("ids[]") Long[] ids){
            //log.info("id"+ids[0]);
            boolean flag= fixInfoService.delByIds(ids);
            return flag;
        }
        @GetMapping("/findById")
        public FixInfo findById(Long id){
            return fixInfoService.findById(id);
        }
        @PostMapping("/update")
        public boolean update(@RequestBody FixInfo fixInfo){
           return fixInfoService.update(fixInfo);
        }
    }
    
    以上は個人の経験ですので、参考にしていただければと思います。