Kotlin EJB с Java-интерфейсом throw UndeclaredThrowableException

Интерфейс Java:

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 с исключением:

public class FailUpdateUserSettingException extends Exception {

  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

Я не вижу никакого вызова удаленного метода и никакой сериализации, которые являются общими причинами такого типа проблем, но может ли это быть проблемой класса-загрузчика? Что класс, созданный кодом Котлина, загружается из другого загрузчика классов, чем класс, проверенный JBoss, и поэтому он воспринимается как непризнанный бросок?

Я не уверен, как проверить. Политика Classloader в контейнере EJB, возможно, – родительский – первый против родительского – последний?

Каково поведение, если вы замените код Kotlin на Java-версию, которая всегда просто выкинет это исключение из частного метода validate (), чтобы убедиться, что это имеет значение?

Какая версия JDK, какая версия Kotlin и какая версия JBoss вы используете?