Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用spring集成通过http头动态传递值_Java_Rest_Soap_Spring Boot_Spring Integration - Fatal编程技术网

Java 如何使用spring集成通过http头动态传递值

Java 如何使用spring集成通过http头动态传递值,java,rest,soap,spring-boot,spring-integration,Java,Rest,Soap,Spring Boot,Spring Integration,我正在处理一个rest应用程序,我的rest应用程序总是通过http头传递一些参数来调用。我的rest应用程序中有一个过滤器,可以为每个请求调用,并从http头检索参数,如下所示 @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServ

我正在处理一个rest应用程序,我的rest应用程序总是通过http头传递一些参数来调用。我的rest应用程序中有一个过滤器,可以为每个请求调用,并从http头检索参数,如下所示

 @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);
}
我的rest应用程序反过来使用spring集成调用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;
}

但是我需要动态地传递“用户电子邮件”和“用户名”,而不是静态的,即我在过滤器中收到的数据。有人能帮我解决这个问题吗。提前感谢。

解决方案是在拦截器中使用
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;
}
(其中MyHolder是一个简单的javabean)。表达式可以是您想要的任何内容(不仅仅是标题访问)。或者,只需传入
消息
,并在代码内部确定用户/电子邮件

 @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","ws_user1@biopacstest.domain");
    connection1.addRequestProperty("user-name","ws_user1");
    return true;
}
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;
}
<int:service-activator expression=@interceptorBean.setUserInfo(#root, headers['user'], headers['email'])" />