Feignリモート呼び出しを使用した場合、プログレッシブオブジェクトの解決に失敗しました。
Feignリモート起動プログレッシブオブジェクトの起動に失敗しました。
最近はSpringCloudのマイクロサービスを構築する際に、Feignを使って時報を遠隔的に呼び出しても、オブジェクトに戻るには無参構造法がなく、他のパラメータを含む構造方法があります。
現地で自分で作ったマイクロサービスのカタログは大体次の通りです。まだ始まったばかりです。その後は徐々に最適化の反復を補充します。興味があるのはforkで住所を教えてください。
https://github.com/zhanghailang123/MyCloud
指導意見を与える。 を採用する。 です。
これから本題に入ります。
シーン:Feignを使って、書き込みのためのデータサービスEurekaClientAをリモートで呼び出した場合、以下のようにエラーが発生しました。
feignモジュールは以下の通りです
ここでは問題を再現するために、溶断ロジックを一時的に注釈します。
エラーメッセージ:
commenxml.jackson.databind.exc.InvalidDefinitionException:Canot construct instance of`org.example.pojo.Student`
エラーの対象:org.example.pojo.Student次のように簡単なbeanオブジェクト:
どうしてこの問題を報告しましたか?無参画関数が存在しないので、プログレッシブに失敗しました。
疑問を持って間違ったところに入る:
この場所です。canInstantiate()メソッドチェックが通っていません。ここで断点を打って真相を探ってみよう。
この検証の内容は:
つまり、無参画構造関数を検証します。呼び出されたstudentオブジェクトに無参画構造関数を加えると正常に呼び出されます。
コンストラクタは成功的に呼び出すことができます。***
問題は大きな問題ではないですが、サービスを構築する過程で、親身になって、確実に参加してこそ、いろいろな奇異な問題を感じられます。このように自分で直接手を下してこそ、収穫が一番大きいです。
Feignが遠隔呼び出しをする注意点
feignを使っている間に問題があったので、ここで以下のようにまとめます。
1.リモート呼び出しを行うアプリインターフェースを定義します。
のメソッドパラメータリストのパラメータはすべて@Request Param("value")を入力しなければなりません。さもなければ、405の異常を呼び出します。これはcontrollerとは違って、controllerの方法はパラメータ名とフロントから入ってきたパラメータキーの対応だけで自動的にパラメータをバインドすることができます。
複雑なタイプは必ず@Request Bodyを付けます。
2.serviceマイクロサービスにおけるControllerのパラメータバインディング
パラメータリストに複雑なタイプがある場合は、Post要求を使用して、Get要求を使用して、Bad Requestエラーを報告し、@Request Body注釈を打つ必要がありますが、普通の基本タイプは@Request Param注釈を付けなくてもいいです。自動バインディングパラメータは自動的に登録できます。
他の問題があれば、追加も歓迎します。コードを入れてください。
app:
最近はSpringCloudのマイクロサービスを構築する際に、Feignを使って時報を遠隔的に呼び出しても、オブジェクトに戻るには無参構造法がなく、他のパラメータを含む構造方法があります。
現地で自分で作ったマイクロサービスのカタログは大体次の通りです。まだ始まったばかりです。その後は徐々に最適化の反復を補充します。興味があるのはforkで住所を教えてください。
https://github.com/zhanghailang123/MyCloud
指導意見を与える。
Eureka
:登録センターサービス端末は、Eureka登録センターEurekaClientA
:そのうちの一つはEurekaサーバーで、名前はちょっと気の向くままになっています。データ提供センターに相当します。ORMフレームドッキングデータベースをしばらく使用していません。該当データを書き込みました。今は練習して使うだけです。後でSpringJPAを使うことを考えています。Mb用が多すぎてFeignZ
:feignモジュールは、負荷バランスを遠隔的に呼び出し、Hystrixの溶断機構を統合しています。もちろん、今は最も簡単なDemoしか作っていません。手触りを練習しています。HystrixDashboard
:Hystrix計器パネルは、現在のサーバ状況に注目してもいいです。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オブジェクト:
どうしてこの問題を報告しましたか?無参画関数が存在しないので、プログレッシブに失敗しました。
疑問を持って間違ったところに入る:
この場所です。canInstantiate()メソッドチェックが通っていません。ここで断点を打って真相を探ってみよう。
この検証の内容は:
つまり、無参画構造関数を検証します。呼び出されたstudentオブジェクトに無参画構造関数を加えると正常に呼び出されます。
コンストラクタは成功的に呼び出すことができます。***
問題は大きな問題ではないですが、サービスを構築する過程で、親身になって、確実に参加してこそ、いろいろな奇異な問題を感じられます。このように自分で直接手を下してこそ、収穫が一番大きいです。
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);
}
}
以上は個人の経験ですので、参考にしていただければと思います。