从aws sdk的1.11.700版切换到1.11.908版,我们的一个库现在无法在受保护的环境中工作。更具体地说,新的sdk版本已经更改了clientconfiguration,因此它现在通过检查env vars来示例化retrypolicy。
不幸的是,我们将把这个库部署到一个禁止(securitymanager就地)访问env变量的环境中。这意味着所有依赖于amazonhttpclient的代码都不再可用,因为:
为了示例化 AmazonHttpClient
你必须通过一个有效的 ClientConfiguration
(不接受null)
为了创建一个有效的 ClientConfiguration
你需要能够阅读环境变量
以下是堆栈跟踪:
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getenv.AWS_RETRY_MODE")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:886)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at com.boomi.security.ExtendedSecurityManager.checkPermissionImpl(ExtendedSecurityManager.java:207)
at com.boomi.security.ExtendedSecurityManager.checkPermission(ExtendedSecurityManager.java:114)
at java.lang.System.getenv(System.java:894)
at com.amazonaws.retry.internal.RetryModeResolver.envVar(RetryModeResolver.java:67)
at com.amazonaws.retry.internal.RetryModeResolver.resolveRetryMode(RetryModeResolver.java:72)
at com.amazonaws.retry.internal.RetryModeResolver.<init>(RetryModeResolver.java:46)
at com.amazonaws.retry.RetryPolicy.<clinit>(RetryPolicy.java:35)
at com.amazonaws.retry.PredefinedRetryPolicies.<clinit>(PredefinedRetryPolicies.java:30)
at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:89)
我们提出的所有选项都不适用于此场景:
子类化 ClientConfiguration
抑制异常:无法尝试捕获对super()构造函数的调用 ClientConfiguration
是一个类,因此我们没有要实现的接口 java.policy
无法修改以允许访问属性:环境不在我们的控制范围内
异常是从而不是从中抛出的,因此它甚至不与单个对象相关。。。
2条答案
按热度按时间dfddblmv1#
看起来amazonhttpclient有一个builder(),所以如果您在builder上设置retrypolicy,客户端配置可能不会查找retrypolicy。
https://docs.aws.amazon.com/awsjavasdk/latest/javadoc/com/amazonaws/http/amazonhttpclient.builder.html
hjzp0vay2#
------另一种选择:
我们可以在官方的sdk代码中看到,clientconfiguration()构造函数可以采用另一个clientconfiguration,因此可以使用extends创建一个自定义的clientconfiguration。
//创建amazonhttpclient并传递此自定义
重写由于getvars而失败的任何方法。