对于上下文:我必须调用我们的一个网络服务(来自批处理作业的内部调用)并传入所需的用户名和密码(该网络服务受 WS-Security 保护)
我的目标是能够将“用户名”的值注入我的 InternalServicePasswordCallback(传递给 WSS4JOutInterceptor 的类名)。 在 CDI 管理的另一个类中注入相同的属性。
这是我要注入的大部分类,它不包含其他构造函数或公共字段。
public class InternalServicePasswordCallback implements CallbackHandler {
private static final String APP_PROPERTIES = "app.properties";
@Inject
@AppConfigProperty("USERNAME")
private String username;
public InternalServicePasswordCallback() {}
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {for (Callback callback : callbacks) {
WSPasswordCallback wpc = (WSPasswordCallback) callback;
if (wpc.getIdentifier().equals(properties.get(username))) {
wpc.setPassword((String) properties.get(somepass));
return;
}
}
}
我将 InternalServicePasswordCallback 类传递给 WSS4JOutInterceptor 拦截器。我通过将 jboss 应用程序部署到我的本地服务器来进行测试。
private void setEndPoint(Object port, String endPoint) {
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endPoint);
Client client = ClientProxy.getClient(port);
Map<String, Object> props = new HashMap<>();
props.put(ConfigurationConstants.ACTION, ConfigurationConstants.USERNAME_TOKEN);
props.put(ConfigurationConstants.PASSWORD_TYPE, WSS4JConstants.PW_TEXT);
props.put(ConfigurationConstants.PW_CALLBACK_CLASS, InternalServicePasswordCallback.class.getName());
props.put(ConfigurationConstants.USER, user);
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);
Endpoint endpoint = client.getEndpoint();
endpoint.getOutInterceptors().add(wssOut);
client.getOutInterceptors().add(new LoggingOutInterceptor(-1));
client.getInInterceptors().add(new LoggingInInterceptor(-1));
}
使用的框架/工具:
我的假设是 jboss/weld CDI 不处理 InternalServicePasswordCallback 类的实例化,因此无法将其他托管 bean 注入其中,对吗?
感谢您的宝贵时间!