spring aop アドバイスからの Null 戻り値が、サマリーのプリミティブ戻り値と一致しない。
2022-02-08 22:04:56
- アドバイスからのNull返り値が、プリミティブな返り値と一致しない。 これは通常、コードがラッピングを行った後に起こります。
- ソースコードがこの例外を投げる場所を見つける(私は、使用しているcglibダイナミックプロキシのコードをグローバルに検索しました)CglibAopProxy#processReturnTypeです。
private static Object processReturnType(Object proxy, Object target, Method method, Object retVal) {
// Massage return value if necessary
if (retVal ! = null && retVal == target && !RawTargetAccess.class.isAssignableFrom(method.getDeclaringClass())) {
// Special case: it returned "this". Note that we can't help
// if the target sets a reference to itself in another returned object.
retVal = proxy;
retVal = proxy; }
Class<? > returnType = method.getReturnType();
// isPrimitive This method is mainly used to determine if the Class is a primitive type (boolean, char, byte, short, int, long, float, double). returnType ! = Void.TYPE whether it is a type without return value
if (retVal == null && returnType ! = Void.TYPE && returnType.isPrimitive()) {
throw new AopInvocationException(
"Null return value from advice does not match primitive return type for: " + method);
}
return retVal;
}
-
例外の最初のケース。
例えば、私のラップアラウンドコードは次のようなものです。
//Wrap around the methods in the service
@Around("execute(* com.zzq.core.test.service. *. *(...)) ")
public void around(ProceedingJoinPoint pjp ){
System.out.println("AOP Aronud before... ");
Object result = null;
try {
result = pjp.proceed();
System.out.println("result : "+ result);
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("AOP Aronud after... ");
}
サービスはこのようになります。
@Override
public int select(int id) {
System.out.println("Enter DaoImpl.select() " + id);
return 1;
}
これは例外を投げます。
Exception in thread "main" org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for: public int com.zzq.core.test.service.impl.TestAopServiceImpl.select(int)
at org.springframework.aop.framework.CglibAopProxy.processReturnType(CglibAopProxy.java:351)
at org.springframework.aop.framework.CglibAopProxy.access$0(CglibAopProxy.java:341)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:636)
at com.zzq.core.test.service.impl.TestAopServiceImpl$$EnhancerBySpringCGLIB$$1f185468.select(<generated>)
at com.zzq.core.test.BootStrap.main(BootStrap.java:18)
なぜなら
loop does not return a value of null
は、その
select method return type is not void
は、その
but rather an int
が、たまたま条件を満たしただけで、この例外を投げます。
int cannot match null
(
unless it is a wrapper type Integer, but it always receives null
).
まだ、ラッパーを変更し、エラーを報告しないように戻り値を追加する必要があります。
@Around("execute(* com.zzq.core.test.service. *. *(...)) ")
public Object around(ProceedingJoinPoint pjp ){
System.out.println("AOP Aronud before... ");
Object result = null;
try {
result = pjp.proceed();
System.out.println("result : "+ result);
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("AOP Aronud after... ");
return result;
}
-
エラー報告ケース II.
上記のプラス戻り値やエラーと組み合わせて、それはプロキシメソッドエラー、上記のような選択メソッドエラーも報告される必要があります
例えば、こんな感じ。Null return value from advice does not match primitive return type for
@Override
public int select(int id) {
int a = 1 / 0;
System.out.println("Enter DaoImpl.select() " + id);
return 1;
}
プロキシメソッド select メソッドでエラーが報告され、プロキシメソッド try キャッチが実行されたはずです。
It's normal to not receive the return value of the proxy method after the error is reported, and null is returned, throwing an exception
.
私はまだaopについてよく知らないので、この記事に間違いがあれば指摘してください、お願いします。
関連
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
ファインバグタイプ
-
JQuery DataTable 详解
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
linux run jarfile Invalid or corrupt jarfile error.
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
-
java 例外。Javaツールの初期化
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
「リソースリーク:'scanner'が閉じない」警告、Scannerステートメントでの解決法
-
Java静的コード解析 - 仕様チェック - checkstyle
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.util.NoSuchElementException 原因解析と解決方法
-
Dateが型に解決できない問題を解決する
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
Javaドッキングリーダの落とし穴について終了コード -1073740940 (0xC0000374)でプロセス終了
-
Ali cloud ubuntu16 システムで LAMP を構築し、tomcat、jdk をインストールし、最初の javaweb プロジェクトを tomcat にデプロイする 詳細手順
-
リソースリーク:'sc'がクローズされない
-
スレッド "main "での例外 java.lang.NullPointerException どのようにそれを解決するには?