java - 以编程方式设置(Spring)bean 属性

标签 java cxf

我目前正在尝试使用 OAuth 身份验证设置 Apache CXF。我现在的情况是 OAuthDataProvider 需要开始提供客户端信息。在 documentation据说您可以使用以下 xml 配置 dataProvider

<!-- implements OAuthDataProvider -->
<bean id="oauthProvider" class="oauth.manager.OAuthManager"/>

<bean id="accessTokenService" class="org.apache.cxf.rs.security.oauth2.services.AccessTokenService">
  <property name="dataProvider" ref="oauthProvider"/>
</bean>

<jaxrs:server id="oauthServer" address="/oauth">
   <jaxrs:serviceBeans>
      <ref bean="accessTokenService"/>
  </jaxrs:serviceBeans>
</jaxrs:server>

现在我不使用 Spring,而是使用 org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet 并拥有 javax.ws.rs.core.Application 类提供所需的类/单例和属性。

现在的问题是;有没有一种方法可以以编程方式配置此 dataProvider 属性,而无需使用 Spring?或者甚至在 web.xml 中?

编辑

我发现可以通过扩展 AccessTokenService 类并执行以下操作来解决该问题。

class CustomAccessTokenService extends AccessTokenService {

    public CustomAccessTokenService() {
        setDataProvider(new OAuthManager());
    }
}

但这似乎不是一个非常优雅的解决方案。

应用程序实现的简化版本

@ApplicationPath("/")
class ServiceApplication extends Application {

    private final Set<Class<?>> _classes = new HashSet<>();

    public ServiceApplication() {
        _classes.add(...)
        _classes.add(AccessTokenService.class)
        ...
    }

    @Override
    public Set<Class<?>> getClasses() {
        return _classes;
    }
}

最佳答案

重写 Application 的 getSingletons() 方法 - 见下文:

好的,在该响应之后,您可以执行此操作(我从我拥有的项目中提取了此内容,我使用这些方法来确定要注入(inject)到我的 REST 服务中的 API key ):

@ApplicationPath("/rest")
public class RESTApplication extends Application {
@Override

    private SingletonServiceObject getMySingletonService(){
        ... Do whatever to setup your singleton ...
    }

    public Set<Object> getSingletons() {
        L.info("Setting up REST - getSingletons()");
        Set<Object> singletons = new HashSet<Object>();
        try {
            singletons.add(getMySingletonService());
            singletons.add(new GeoService());
        } catch (IOException e) {
            throw new ProjectRuntimeException("Error creating service!", e);
        }
        L.info("Finished REST - getSingletons()");
        return singletons;
    }
}

查看您的编辑后,您可以执行以下操作:

WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
AccessTokenService myBean = context.getBean(AccessTokenService.class);
myBean.setDataProvider(...whatever...);

请注意,还有一种方法可以从您的 Application 类中提供 beans 的实例。我不记得如何立即执行此操作,但无论哪种方式都应该有效。

  • 预编辑答案如下*

所有 XML 方法都是 accessTokenService.setDataProvider(oauthProvider),因此让您的 Application 类在您正在创建的 accessTokenService 上调用该方法.

关于java - 以编程方式设置(Spring)bean 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48907354/

相关文章:

java - 在 Java Spring boot jpa 中将 List<Map<String, String>> 转换为对象

java - ArrayDescriptor 是线程安全的吗?

soap - 连接失败时如何使用 WSS4JOutInterceptor 在 CXF 中捕获 SOAP 请求消息

java - 我想在 CXF codegen 上添加 @XmlRoot 注释

java - Apache CXF Java 客户端的安全策略

java - 如何使用gradle在类路径中指定外部文件夹内容?

JavaCC语法问题,具有理解能力

java - Java 开发人员的 Paypal 预付款

java - ESB 支持的数据库

java - 具有 UsernameTokenSignature 的 CXF SOAP 服务的正确配置是什么?