Dubbo2.7.8+Nacos @DubboService アノテーションと Spring Boot で落とし穴が発生する

サービス プロデューサーのアノテーションは、@DubboService が
ローカルで開始されたときはエラーを報告しないが、サーバーで開始されたときは次のエラーが報告されるというものです。最も厄介なことは、エラーが報告された後、NACOS はサービスの登録が成功したことを示すプロンプトも表示することです。 、正常なインスタンスが NOCOS サービス リストで見つかります。

java.lang.IllegalArgumentException: @Service interfaceClass() or interfaceName() or interface class must be present!
	at org.springframework.util.Assert.notNull(Assert.java:201)
	at org.apache.dubbo.config.spring.util.DubboAnnotationUtils.resolveServiceInterfaceClass(DubboAnnotationUtils.java:122)
	at org.apache.dubbo.config.spring.beans.factory.annotation.ServiceClassPostProcessor.registerServiceBean(ServiceClassPostProcessor.java:288)
	at org.apache.dubbo.config.spring.beans.factory.annotation.ServiceClassPostProcessor.registerServiceBeans(ServiceClassPostProcessor.java:175)
	at org.apache.dubbo.config.spring.beans.factory.annotation.ServiceClassPostProcessor.postProcessBeanDefinitionRegistry(ServiceClassPostProcessor.java:134)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:126)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:707)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:533)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:405)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
	at com.bba.rtm.vms.VehicleManagementServiceApplication.main(VehicleManagementServiceApplication.java:18)

私のコード構造は一般的なコード構造とは異なります。将来 Dubbo が他のフレームワークに置き換えられるのを防ぐために、DubboService をコントローラー層として使用し、サービス層と Dao 層のコードを変更する必要がないようにしています。将来的には枠組みを変える。
したがって、私のコードには @DubboService と @Service アノテーションがあり、
具体的なパッケージは
org.apache.dubbo.config.annotation.DubboService

org.springframework.stereotype.Serviceです。

最初は 2 つのパッケージ間の競合だと思いました。Dubbo がパッケージをスキャンする方法について長い間検索しましたが、解決策が見つかりませんでした。インターネットで見つけた投稿のほとんどには、@DubboService アノテーション クラスがスキャンされていないと書かれていました。インターフェイスを実装していて実装がありませんでした。しかし、この低レベルのエラーは「不可能です。私のクラスには実装されたインターフェイス クラスがあります。パッケージのパスは異なりますが、そこにあるはずです。インターネットで言われていることはあまり信頼できません。最後に」 , 他の投稿から属性interfaceClassを見つけました。

解決策:
@DubboService アノテーションに、interfaceClass 属性と
interfaceName 属性を追加します。この属性は試していませんが、結局のところ、クラスの方が直接的です。コードは以下のように表示されます。

@DubboService(group = "lwb", interfaceClass = com.lwb.dubbo.TestService.class)

これはクラスのフル パスである必要があることに注意してください。クラス名のみを記述する場合、上記のインポートによりエラーは報告されません。ただし、起動時に TestService インターフェイスが見つからず、同じエラーが報告されます。

@DubboService(group = "lwb", interfaceClass = TestService.class)

おすすめ

転載: blog.csdn.net/lwb314/article/details/121075920