如何在每个Web服务调用中指定参数?

时间:2009-10-15 00:39:39

标签: java spring jax-ws dry web-services

目前,我们应用程序的每个Web服务都有一个为每个方法添加的用户参数。例如:

@WebService
public interface FooWebService {
   @WebMethod
   public Foo getFoo(@WebParam(name="alwaysHere",header=true,partName="alwaysHere") String user, @WebParam(name="fooId") Long fooId);

 @WebMethod
   public Result deletetFoo(@WebParam(name="alwaysHere",header=true,partName="alwaysHere") String user, @WebParam(name="fooId") Long fooId);

   // ...
}

服务中可能有20个方法,每个方法都有第一个参数作为用户。并且可能有二十个Web服务。

我们实际上并没有在实现中使用'user'参数 - 事实上,我不知道它为什么存在 - 但我没有参与设计,并且把它放在那里的人有一个原因(我希望)。

无论如何,我正在努力理顺这个泥球。

我已经通过Spring代理包装Web服务已经走了很长的路,这允许我在拦截器中进行一些前后处理(在每个至少有20行复制粘贴的锅炉板之前)法)。

我想知道是否有某种“消息头”我可以应用于方法或包,并且可以通过某种类型的处理程序或每种Web服务方法之外的东西访问。

提前感谢您的建议, LES

3 个答案:

答案 0 :(得分:0)

期望user消息与SOAP headers绑定的人或者是什么?您的Web服务是否安全?这是某种身份验证标头吗?这可能是最初的意图。实际上,有人应该对这些问题有答案。找谁。如果您发现自己永远不需要它,请停止传递它。但是如果你需要它,我认为最好添加它(即使你现在不使用它),除非修改WSDL不是问题(特别是在客户端)。

PS:我不知道如何避免向Java方法添加带@WebParam(header=true)的参数,以便生成一个WSDL,其操作输入中有<soap:header>。 AFAIK,这是从Java开始时JAX-WS的工作方式。

答案 1 :(得分:0)

如果没有理由需要将该变量作为参数,那么您可以让每个服务都扩展一个超类。在那个超级类中,spring使用@Context注释或@Resource注释注入MessageContext,ServletContext,ServletRequest,HttpHeaders或任何合适的(可能是JAXWS的MessageContext)。

然后在该超类中提供一些方法以从请求中提取用户信息。

答案 2 :(得分:0)

如果您正在尝试进行身份验证,则可以使用协议或逻辑处理程序等预定义处理程序来处理上下文。例如。实现SoapHanlder(这是一个协议处理程序)接口,从那里将该类添加到您提供的每个服务的处理程序链中。非常简单而有力。这位绅士在这个话题上有最好的tutorial