如何在WSS4JOutInterceptor的CallbackHandler中注入@AppConfigProperty

问题描述 投票:0回答:0

对于上下文:我必须调用我们的一个网络服务(来自批处理作业的内部调用)并传入所需的用户名和密码(该网络服务受 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-eap-7.3
  • Apache CXF 版本:3.3.9
  • Java版本:OpenJDK 11
  • Jakarta EE版本:jakarta.enterprise.cdi-api:2.0.2.redhat-00002

我的假设是 jboss/weld CDI 不处理 InternalServicePasswordCallback 类的实例化,因此无法将其他托管 bean 注入其中,对吗?

感谢您的宝贵时间!

java cxf jax-ws cdi ws-security
© www.soinside.com 2019 - 2024. All rights reserved.