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

Java 以编程方式设置(Spring)bean属性,java,cxf,Java,Cxf,我目前正在尝试使用OAuth身份验证设置Apache CXF。我的观点是,OAuthDataProvider需要开始提供客户机信息。在中,说明可以使用以下xml配置数据提供程序 现在我没有使用Spring,而是使用org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet,并使用javax.ws.rs.core.Application类提供所需的类/单例和属性 现在的问题是;有没有一种方法可以在不必使用Spring的情况下以编程方式配置此数据提

我目前正在尝试使用OAuth身份验证设置Apache CXF。我的观点是,
OAuthDataProvider
需要开始提供客户机信息。在中,说明可以使用以下xml配置
数据提供程序


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

现在的问题是;有没有一种方法可以在不必使用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;
    }
}
@ApplicationPath(“/”)
类ServiceApplication扩展了应用程序{
私有最终集>getClasses(){
返回类;
}
}

覆盖应用程序的
getSingleton()
方法-请参见以下内容:

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

注意,还有一种方法可以从
应用程序
类中提供bean实例。我不记得该怎么做了,但不管哪种方法都应该管用

  • 编辑前的答案如下*

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

我不是在创建accessTokenService,它是由JAX/CXF在某处完成的,我只是在
javax.ws.rs.core.Application
getClasses
方法中提供
AccessTokenService.class
,查看新答案-两个选项WebApplicationContext似乎仅在使用Spring时可用。确定,再次查看我的编辑-您可以使用
getSingleton()
而不是
getClasses
是否要将AccessTokenService部署为一个独立的JAX-RS端点?目前,它与项目中的所有其他服务一样映射到/services/*上,如果它是一个将其映射到单独端点的解决方案,我不明白。你说你不使用Spring,但还是想要Spring配置?不,我不想要Spring配置,这是我试图避免的。但是我目前没有办法访问
AccessTokenService
实例来调用
setDataProvider
。在Spring中,上面的bean.xml将处理一些事情。在您的案例中,令牌服务注册在哪里?你应该可以在那里访问它。
@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...);