Java 如何使用spring集成通过http头动态传递值
我正在处理一个rest应用程序,我的rest应用程序总是通过http头传递一些参数来调用。我的rest应用程序中有一个过滤器,可以为每个请求调用,并从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
@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'])" />