以编程方式设置 (Spring) bean 属性
Set (Spring) bean property programmatically
我目前正在尝试使用 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
class 提供 classes/singletons 和所需的属性。
现在的问题是;有没有办法以编程方式配置此 dataProvider
属性 而不必使用 Spring?或者甚至在 web.xml 中?
编辑
我发现我可以通过扩展 AccessTokenService class 并执行以下操作来解决它。
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()
方法 - 见下文:
好的,在那个响应之后,你可以这样做(我从我的一个项目中提取这个,我使用这些方法来确定 API 键注入我的 REST 服务):
@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
class 中提供 bean 实例。我不记得该怎么做 off-hand,但任何一种方法都应该有效。
- 编辑前的答案如下 *
所有 XML 的意思都是 accessTokenService.setDataProvider(oauthProvider)
,因此让您的 Application
class 在您正在创建的 accessTokenService
上调用该方法。
我目前正在尝试使用 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
class 提供 classes/singletons 和所需的属性。
现在的问题是;有没有办法以编程方式配置此 dataProvider
属性 而不必使用 Spring?或者甚至在 web.xml 中?
编辑
我发现我可以通过扩展 AccessTokenService class 并执行以下操作来解决它。
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()
方法 - 见下文:
好的,在那个响应之后,你可以这样做(我从我的一个项目中提取这个,我使用这些方法来确定 API 键注入我的 REST 服务):
@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
class 中提供 bean 实例。我不记得该怎么做 off-hand,但任何一种方法都应该有效。
- 编辑前的答案如下 *
所有 XML 的意思都是 accessTokenService.setDataProvider(oauthProvider)
,因此让您的 Application
class 在您正在创建的 accessTokenService
上调用该方法。