【问题标题】:How to specify a parameter as part of every web service call?如何将参数指定为每个 Web 服务调用的一部分?
【发布时间】:2009-10-15 00:39:38
【问题描述】:

目前,我们应用程序的每个 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 服务。

我们实际上并没有在实现中使用“用户”参数——事实上,我不知道它为什么存在——但我没有参与设计,把它放在那里的人是有原因的(我希望)。

不管怎样,我正在努力理顺这个大泥球。

通过 Spring 代理包装 Web 服务,我已经取得了长足的进步,这使我可以在拦截器中进行一些前后处理(在每个至少有 20 行复制粘贴的样板代码之前)方法)。

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

提前感谢您的建议, LES

【问题讨论】:

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


    【解决方案1】:

    谁或什么希望user 消息绑定到SOAP headers?您的网络服务是否安全?那是某种身份验证标头吗?这可能是初衷。其实,这些问题应该有人回答。找谁。如果你发现你永远不需要它,停止传递它。但是如果您需要它,我认为最好添加它(即使您现在不使用它),除非修改 WSDL 不是问题(尤其是在客户端)。

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

    【讨论】:

    • 我认为它应该用于将来的身份验证,但目前,没有人用它做任何事情。让我很恼火的是,这似乎无法 DRYly 完成。 :(
    • 带有 UsernameToken 配置文件的 WS-Security 可能是执行此操作的 DRY 方式,但是,您并没有使用它(实际上,我不知道它如何与 Java 一起使用第一种方法)。
    【解决方案2】:

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

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

    【讨论】:

    • 重点是在生成的 WSDL 中有一个用于该操作的 <soap:header>。继承在这里没有帮助。
    【解决方案3】:

    如果您要尝试完成身份验证,则可以从预定义的处理程序(例如协议或逻辑处理程序)中操作上下文。例如。实现 SoapHanlder(它是一个协议处理程序)接口,从那里将该类添加到您提供的每个服务的处理程序链中。非常简单而强大。这位先生在这个话题上有最好的tutorial

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      相关资源
      最近更新 更多