为了账号安全,请及时绑定邮箱和手机立即绑定

无法调用方法:java.lang.IllegalArgumentException:参数类型不匹配

无法调用方法:java.lang.IllegalArgumentException:参数类型不匹配

牧羊人nacy 2023-06-14 10:44:40
我试图通过对已通过其 JNDI 引用查找的 EJB 进行反射来调用方法。它需要三个参数:一个 EndUser 对象(自定义对象)、一个 Set(自定义类)和一个布尔值。第一个对象导致调用失败并显示“无法调用方法:java.lang.IllegalArgumentException:参数类型不匹配”。只要第一个参数不为空,就会发生这种情况。将其设置为 null 会使错误消失。实际调用:  public Relation createRelation(final Relation relation, final HashSet<Contact> contacts) {        final EndUser user = new EndUser();        Object[] args = new Object[]{user, contacts, false};        try {            return (Relation) EjbUtils.invoke("registerEndUser", REGISTRATION_SERVICE_JNDI, args);        } catch (final Throwable throwable) {            LOGGER.error("Could not invoke method", throwable);            return null;        }}EjbUtils 方法: public static Object invoke(final String methodName, final String ejbName, final Object... args) throws Throwable {        final String jndiName = getEjbJndi(ejbName);        final Object remoteObject = lookup(jndiName);        final Method[] methods = remoteObject.getClass().getMethods();        for (final Method method : methods) {            if (methodName.equals(method.getName()) && args.length == method.getParameterCount()) {                try {                    return method.invoke(remoteObject, args);                } catch (IllegalAccessException e) {                    final String message = String.format("Could not invoke method %s on %s: %s", methodName, ejbName, e.getMessage());                    LOGGER.error(message);                    throw new IllegalStateException(message, e);                } catch (InvocationTargetException e) {                    throw e.getCause();                }            }        }        throw new IllegalArgumentException("Method not found");    }我试图调用的方法:    public Relation registerEndUser(final EndUser relation, final Set<Contact> contacts, boolean sendMail)            throws RegistrationServiceException, RegistrationServiceWarning {        return registerRelation(relation, contacts, sendMail);    }没有抛出异常并且调用了该方法,这应该表明参数的类型正确。调试时我可以看到找到了正确的方法,并且所需的参数类型与我提供的相同。关于如何找出实际问题的任何想法?
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

我已经能够找到原因。我使用远程查找和反射的原因是我在另一个 EAR 中调用 EJB。结果,EndUser类已由不同的类加载器创建,因此未被识别为所需类的实例。

查看完整回答
反对 回复 2023-06-14
  • 1 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信