如何通过HTTP集成动态使用spring集成传递值

问题描述:

我正在处理其他应用程序,并且我的其他应用程序总是通过传递一些参数通过http headers来调用。而且我的rest应用程序中有一个过滤器被调用每个请求并从http头中检索参数,如下所示。如何通过HTTP集成动态使用spring集成传递值

@Override 
public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest httpServletRequest=(HttpServletRequest) request; 
    String email = httpServletRequest.getHeader("user-email");   
    String userName = httpServletRequest.getHeader("user-name"); 
    chain.doFilter(request, response); 
} 

我的其他应用程序反过来使用spring集成调用soap服务。并且调用soap服务的代码如下。

@RequestMapping(value = "/projects", method = RequestMethod.GET, produces = "application/json") 
public @ResponseBody List<Project> getProject(HttpServletRequest httpRequest) { 
    GetAuthorizedWebSendTransferProjects request = new GetAuthorizedWebSendTransferProjects(); 
    GetAuthorizedWebSendTransferProjectsResponse response = gw.getResponse(request); 
    JAXBElement<ArrayOfProjectContainer> arr = response.getGetAuthorizedWebSendTransferProjectsResult(); 
    ArrayOfProjectContainer arr1 = arr.getValue(); 
    List<ProjectContainer> arr2 = arr1.getProjectContainer(); 
    List<Project> projects = getPopulatedProjectList(arr2); 
    return projects; 
} 

应用的context.xml

<int:chain input-channel="requestChannel" output-channel="outputChannel"> 
    <int-ws:header-enricher> 
     <int-ws:soap-action 
      value="http://tempuri.org/IPermissionService/GetAuthorizedWebSendTransferProjects"/> 
    </int-ws:header-enricher> 
    <int-ws:outbound-gateway 
     uri="http://10.255.2.51/PermissionService.svc?wsdl" marshaller="marshaller" 
     unmarshaller="marshaller" interceptor="addHttpHeaderInterceptor"/> 
</int:chain> 

我也有一个拦截器添加参数以HTTP标头这是一个静态数据。

@Override 
public boolean handleRequest(MessageContext messageContext) 
     throws WebServiceClientException { 
    TransportContext context = TransportContextHolder.getTransportContext(); 
    HttpUrlConnection connection = (HttpUrlConnection) context.getConnection(); 
    HttpURLConnection connection1= connection.getConnection(); 
    connection1.addRequestProperty("user-email","[email protected]"); 
    connection1.addRequestProperty("user-name","ws_user1"); 
    return true; 
} 

但我需要通过“用户电子邮件”和“用户名”,而不是动态静态之一,即,这是我在过滤器中已经接收到的数据。任何人都可以帮助我解决这个问题。提前致谢。

解决方法是在拦截器中使用ThreadLocal,然后在调用网关之前设置标头。

private final ThreadLocal<MyHolder> holder = new ThreadLocal<MyHolder>(); 

@Override 
public boolean handleRequest(MessageContext messageContext) 
     throws WebServiceClientException { 
    TransportContext context = TransportContextHolder.getTransportContext(); 
    HttpUrlConnection connection = (HttpUrlConnection) context.getConnection(); 
    HttpURLConnection connection1= connection.getConnection(); 
    MyHolder holder = this.holder.remove(); 
    connection1.addRequestProperty("user-email", holder.getEmail()); 
    connection1.addRequestProperty("user-name", holder.getUser()); 
    return true; 
} 


public Message<?> setUserInfo(Message<?> message, String user, String email) { 
    this.holder.set(new MyHolder(user, email)); 
    return message; 
} 

然后,在你的集成流程,添加到chain ...

<int:service-activator [email protected](#root, headers['user'], headers['email'])" /> 

(其中MyHolder是一个简单的java bean)。表达式可以是任何你想要的(不只是头部访问)。或者,只需传入Message<?>并在代码中内部确定用户/电子邮件。