2017-08-16 16 views
0

Javaインタフェース投げる:Kotlin EJBでUndeclaredThrowableException

public interface IUserSettingManager { 

     UserSettingApi updateSetting(Long userId, UserSetting userSettingNew) throws FailUpdateUserSettingException; 
    } 

Kotlin EJB:例外と

@Stateless 

@Local(IUserSettingManager::class) 

open class UserSettingManager : DataManager(), IUserSettingManager { 

    private companion object { 
     private val LOG = LoggerFactory.getLogger(UserSettingManager::class.java) 
    } 

     @Throws(FailUpdateUserSettingException::class) 
     private fun validate(userSetting: UserSetting) { 
      if (userSetting.avatar?.length ?: 0 > DBConstant.UUID_VARCHAR_SIZE) { 
       throw FailUpdateUserSettingException("avatar length") 
      } 
     } 

     @Throws(FailUpdateUserSettingException::class) 
     override fun updateSetting(userId: Long, userSettingNew: UserSetting): UserSettingApi { 
      val logger = LOG.silentEnter("updateSetting") 

      try { 
       validate(userSettingNew) 

       ..... 

      } catch (ex: Exception) { 
       val msg = "userId:$userId, user setting:$userSettingNew" 

       when (ex) { 
        is FailUpdateUserSettingException -> { 
         logger.debug("$msg, ex:$ex") 
         throw ex 
        } 
        else -> { 
         logger.error(msg, ex) 
         throw FailUpdateUserSettingException(ex.toString()) 
        } 
       } 
      } 
     } 
    } 

Javaクラス:

パブリッククラスFailUpdateUserSettingExceptionがExceptiを拡張不正なデータを持つ{

 public FailUpdateUserSettingException() { 
this(error); 

    } 

}

ときにトライコールEJB上、例外でUndeclaredThrowableExceptionを取得し、その結果、トランザクションが

Caused by: java.lang.reflect.UndeclaredThrowableException 
    at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:34) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) 
    at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:52) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.component.interceptors.NonPooledEJBComponentInstanceAssociatingInterceptor.processInvocation(NonPooledEJBComponentInstanceAssociatingInterceptor.java:59) [wildfly-ejb3-10.0.0.Final.jar:10.0.0.Final] 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:254) [wildfly-ejb3-10.0.0.Final.jar:10.0.0.Final] 
    ... 137 more 
Caused by: com.pay.utils.shared.exception.user.FailUpdateUserSettingException: Fail update user setting. avatar length 
    at com.pay.manager.UserSettingManager.validate(UserSettingManager.kt:xx) 
    at com.pay.manager.UserSettingManager.updateSetting(UserSettingManager.kt:xx) 
    at com.pay.manager.UserSettingManager.updateSetting(UserSettingManager.kt:xx) 


..... 

結果

するjavax.ejb圧延.EJBTransactionRolledbackException

+0

関連:[なぜKotlinがParseExceptionではなくそのようなUndeclaredThrowableExceptionを受け取るのですか?](https://stackoverflow.com/questions/44788906/why-kotlin-receives-such-an-undeclaredthrowableexception-rather-than-a-parseexce/44790753#44790753) –

+0

この問題を回避するにはどうすればよいですか? 関数が自分で書き込んだ場合、その解決法はとても簡単です。はい、関数がチェック例外をスローしていると宣言します。例えば: @throws(はParseException ::クラス) 楽しいconvertToDate(){/ ** /} **私のために動作しません。** – Ant20

+0

なぜあなたのために働くしませんでしたか? –

答えて

0

このタイプの問題の一般的な原因であるリモートメソッド呼び出しもシリアル化も表示されませんが、クラスローダーの問題ですか? Kotlinコードでインスタンス化されたクラスは、JBossでチェックされているクラスとは異なるクラスローダーからロードされるため、認識できないスロー可能と見なされます。

確認方法がわかりません。おそらく、EJBコンテナのクラスローダーポリシー - 親 - 最初対親 - 最後?

Kotlinコードを、private validate()メソッドから例外をスローするJavaバージョンに置き換えて、それが違いをもたらすかどうかを確認するための動作は何ですか?

JDKのバージョン、Kotlinのバージョン、JBossのバージョンはどんなものを使用していますか?

+0

WildFly Full 10.0.0.Final(WildFly Core 2.0。10.Final)、java version "1.8.0_91、kotlin 1.0.6 – Ant20

+0

JavaバージョンとKotlinバージョンの両方が古いです。少なくともKotlin 1.1.4にアップデートすることをお勧めします。 コードをJava –

+0

Java EJBが完全に動作する – Ant20