Spring - 使用Web Service时未加载属性文件的值

时间:2015-05-18 08:40:08

标签: java spring web-services spring-mvc

我在春天使用Web服务并获取值。为此,我使用GenericHandler Class为Web服务XML设置标头,以填充XML使用属性文件中的凭据和其他链接并加载它们。但是,我无法将值加载到变量中。这是我的代码,

@Component
Class WSAuthentication extends GenericHandler
{
    @Value("${webservice.consumerId}")
    private String consumerIdString;

    @Override
    public QName[] getHeaders()
    {
        return null;
    }

    public boolean handleRequest(MessageContext context)
    {
        .... // SOAP Message context codes
        System.out.println(consumerIdString);
        // the above line Prints null 
    }

}

Web Service Handler类如下:

import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.HandlerRegistry;
import javax.xml.rpc.ServiceException;

public class WSHandler
{
    public StubClass addHandlerToGetInfo()
    {
        ....// Web Service stub codes
        HandlerRegistry handlerRegistryObject = locatorStubObject.getHandlerRegistry();
        List chain = handlerRegistryObject.getHandlerChain((QName)locatorStubObject.getPorts().next());
        HandlerInfo handlerInfoObject = new HandlerInfo();
        handlerInfoObject.setHandlerClass(WSAuthentication.class);
        chain.add(handlerInfoObject);
       return stubObject;
    }

}

在另一个类中,我使用这个Web服务来获取代码,我在一个注释为另一个bean的@PostProcess的方法中调用此代码,

....// Consuming  code goes here
WSHandler wsHandlerObj = new WSHandler();
StubClass stubObj = wsHandlerObj.addHandlerToGetInfo();
// Invoking WS Stub methods to get values
WSResponseClass responseObj = stubObj.getProfile(id);

这里我无法从属性中获取consumerIdString对象,另一方面,我能够对WSAuthentication类中的值进行硬编码,并且当我尝试执行该方式时,它会很好。当我尝试访问该成员变量时,从属性文件加载会给出一个空对象。

我的问题:

  • 是否会创建类WSAuthentication的实例 的HandlerInfo?或者它如何访问WSAuthentication类?
  • HandlerInfo是否获取Web服务标头 通过WSAuthentication的Class实例?
  • 还有别的办法吗? 这样做?

或者我应该使用反射来初始化类的成员变量? 请帮帮我,谢谢!

2 个答案:

答案 0 :(得分:1)

根据Spring Reference Manual,附录E,基于XML Schema的配置,

<util:properties id="env" location="classpath:application.properties">

是:

的快捷方式
<!-- creates a java.util.Properties instance with values loaded from supplied location -->
<bean id="env" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="location" value="classpath:application.properties"/>
</bean>

这意味着应该通过它们的包含bean来访问这些属性。

我认为你想要实现的是PropertyPlaceholderConfigurer,应该声明为:

<context:property-placeholder location="classpath:/application.properties"/>

快捷方式:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations" value="classpath:/application.properties"/>
</bean>

因为这里的属性可以直接用于配置其他bean。

答案 1 :(得分:1)

您将WSAuthentication设置为Handler,如下所示: 的 handlerInfoObject.setHandlerClass(WSAuthentication.class);

我认为它是将它作为普通bean而不是从Spring ApplicationContext获取,因此没有为@Value注释属性设置值。

只是为了确认注入任何其他Spring bean并看到它的价值。如果为null则表示使用Reflection而不是使用Spring创建WSAuthentication的实例。