2

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

   // ...
}

一个服务中可能有二十个方法,每个方法的第一个参数都是用户。并且可能有二十个网络服务。

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

无论如何,我正试图理顺这个大泥球。

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

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

提前感谢您的建议,LES

4

3 回答 3

0

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

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

于 2009-10-15T01:06:48.413 回答
0

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

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

于 2009-10-15T03:37:54.853 回答
0

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

于 2014-06-17T07:26:37.647 回答