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

时间:2018-02-21 13:36:24

标签: 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;
    }
}

1 个答案:

答案 0 :(得分:1)

覆盖应用程序的getSingletons()方法 - 见下文:

好的,在那个响应之后,你可以这样做(我从我拥有的项目中提取了这个,我使用这些方法确定要注入我的REST服务的API密钥):

@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类的bean实例。我不记得如何做到这一点,但两种方式都应该有效。

  • 预编辑答案低于*

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