我试图通过对通过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);
}
怪异的部分是:如果我替换
final EndUser user = new EndUser();
与
final EndUser user = null;
不会引发任何异常并调用该方法,这应表明参数是的正确类型。
在调试时,我可以看到找到了正确的方法,并且所需的参数类型与我提供的参数类型相同。 是否有关于如何找出实际问题的想法?
答案 0 :(得分:0)
我能够找到原因。我使用远程查找和反射的原因是我在另一个EAR中调用EJB。结果, EndUser 类是由另一个类加载器创建的,因此未被识别为必需类的实例。 有关更多信息,请参见ClassCastException when casting to the same class。