Error: java.io.IOException: java.lang.reflect.InvocationTargetException
at com.aliyun.fs.oss.utils.OSSClientAgent.handleException(OSSClientAgent.java:397)
at com.aliyun.fs.oss.utils.OSSClientAgent.deleteObject(OSSClientAgent.java:217)
at com.aliyun.fs.oss.nat.JetOssNativeFileSystemStore.delete(JetOssNativeFileSystemStore.java:391)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
at com.sun.proxy.$Proxy14.delete(Unknown Source)
at com.aliyun.fs.oss.nat.NativeOssFileSystem.rename(NativeOssFileSystem.java:522)
at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.commitTask(FileOutputCommitter.java:445)
at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.commitTask(FileOutputCommitter.java:425)
at org.apache.hadoop.mapred.Task.commit(Task.java:1163)
at org.apache.hadoop.mapred.Task.done(Task.java:1025)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:397)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.aliyun.fs.oss.utils.OSSClientAgent.deleteObject(OSSClientAgent.java:215)
... 19 more
Caused by: com.aliyun.oss.OSSException: AccessDenied
[ErrorCode]: AccessDenied
[RequestId]: 57109923941E5EA00A8CC20A
[HostId]: emr-logs2.oss-cn-hangzhou-internal.aliyuncs.com
[ResponseError]:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>AccessDenied</Message>
<RequestId>57109923941E5EA00A8CC20A</RequestId>
<HostId>emr-logs2.oss-cn-hangzhou-internal.aliyuncs.com</HostId>
</Error>
at com.aliyun.oss.common.utils.ExceptionFactory.createOSSException(ExceptionFactory.java:99)
at com.aliyun.oss.internal.OSSErrorResponseHandler.handle(OSSErrorResponseHandler.java:72)
at com.aliyun.oss.common.comm.ServiceClient.handleResponse(ServiceClient.java:242)
at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:124)
at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:67)
at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:92)
at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:140)
at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:111)
at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:106)
at com.aliyun.oss.internal.OSSObjectOperation.deleteObject(OSSObjectOperation.java:386)
at com.aliyun.oss.OSSClient.deleteObject(OSSClient.java:644)
at com.aliyun.oss.OSSClient.deleteObject(OSSClient.java:638)
... 24 more
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据提供的错误堆栈信息,java.io.IOException: java.lang.reflect.InvocationTargetException
是由反射调用方法时抛出的异常。具体来说,InvocationTargetException
是由于被调用的方法内部抛出了未捕获的异常。在本例中,deleteObject
方法调用失败,根本原因是 com.aliyun.oss.OSSException: AccessDenied
,即 OSS 服务拒绝了访问请求。
OSS 权限问题
错误信息中明确指出:
com.aliyun.oss.OSSException: AccessDenied
[ErrorCode]: AccessDenied
[RequestId]: 57109923941E5EA00A8CC20A
[HostId]: emr-logs2.oss-cn-hangzhou-internal.aliyuncs.com
这表明当前用户或服务没有足够的权限执行 deleteObject
操作。可能的原因包括: - OSS Bucket 的访问控制策略(ACL)未正确配置。 - 使用的 AccessKey 或 STS Token 缺乏删除对象的权限。 - 请求的资源路径不正确,导致权限验证失败。
反射调用异常封装
InvocationTargetException
是 Java 反射机制中的常见异常,它封装了被调用方法内部抛出的实际异常。在本例中,实际异常是 AccessDenied
,需要重点解决权限问题。
确认 AccessKey 权限
确保使用的 AccessKey 或 STS Token 具有删除 OSS 对象的权限。可以通过以下步骤检查:
{
"Effect": "Allow",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss::123456789012:emr-logs2/*"
]
}
检查 Bucket ACL 配置
确认目标 Bucket 的访问控制策略允许当前用户执行删除操作。可以通过 OSS 控制台或 API 检查 Bucket 的 ACL 设置。
检查对象路径
确保 deleteObject
方法中传入的对象路径(Key)正确无误。如果路径错误,OSS 会返回 AccessDenied
错误。
确认 Endpoint 配置
确保使用的 OSS Endpoint 正确。例如,emr-logs2.oss-cn-hangzhou-internal.aliyuncs.com
是内网 Endpoint,适用于 VPC 环境。如果客户端不在 VPC 内,请使用公网 Endpoint。
在代码中捕获 InvocationTargetException
并提取其根本原因,便于快速定位问题。示例如下:
try {
ossClient.deleteObject(bucketName, objectKey);
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
if (cause instanceof com.aliyun.oss.OSSException) {
com.aliyun.oss.OSSException ossException = (com.aliyun.oss.OSSException) cause;
System.err.println("OSS Error Code: " + ossException.getErrorCode());
System.err.println("OSS Request ID: " + ossException.getRequestId());
} else {
e.printStackTrace();
}
}
权限最小化原则
在配置权限时,遵循最小化原则,仅授予必要的操作权限,避免过度授权。
日志排查
如果问题仍未解决,建议启用 OSS 的访问日志功能,记录所有请求的详细信息,便于进一步排查。
网络环境检查
如果使用内网 Endpoint,请确保客户端与 OSS 服务在同一 VPC 内。否则,切换为公网 Endpoint。
通过上述分析和解决方案,可以有效解决 java.io.IOException: java.lang.reflect.InvocationTargetException
异常的根本原因。重点在于检查 OSS 权限配置、验证请求参数,并在代码中妥善处理异常。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。