Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 将HttpRequest注入SOAP端点_Java_Spring_Jaxb_Jaxb2 - Fatal编程技术网

Java 将HttpRequest注入SOAP端点

Java 将HttpRequest注入SOAP端点,java,spring,jaxb,jaxb2,Java,Spring,Jaxb,Jaxb2,我正在寻找一种将http头信息和SOAP消息一起转发到Spring端点的方法,以便访问IP地址等详细信息 相关web.xml: <servlet> <servlet-name>SoapHost</servlet-name> <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> &l

我正在寻找一种将http头信息和SOAP消息一起转发到Spring端点的方法,以便访问IP地址等详细信息

相关web.xml:

<servlet>
    <servlet-name>SoapHost</servlet-name>
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
    <init-param>
        <param-name>transformWsdlLocations</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>SoapHost</servlet-name>
    <url-pattern>/ws/*</url-pattern>
</servlet-mapping>
我尝试将其添加为参数之一:

    @ResponsePayload
    @PayloadRoot(localPart = "...Request", namespace = "http://www.mycee.co.za/SoapHost")
public ...Response do...(
        @RequestPayload ...Request request,  
        HttpServletRequest httpServletRequest) {

但这在XML响应中返回了一个错误:“没有端点适配器”和“您的端点是用@endpoint注释的,还是它实现了一个受支持的接口,如MessageHandler或PayloadEndpoint”

很抱歉没有直接回答您的问题,但为什么不将过滤器放在servlet之前呢?在此筛选器中,您可以将IP或任何其他信息存储在某些上下文对象中,如ThreadLocal或类似对象

我相信,SOAP应该对IP地址一无所知。这些是不同的抽象层。根据设计,如果需要某些元信息,SOAP将在SOAP头上运行

回复topic starter的评论:

不,它不会破坏SpringWS流,因为将servlet放在过滤器后面是绝对正常的。过滤器是一个普通的
javax.servlet.Filter

请举例说明:

端点是Spring示例的稍微修改版本

@Endpoint
public class FilteredEndpoint {
    @ResponsePayload
    @PayloadRoot(localPart = "HolidayRequest", namespace = "http://mycompany.com/hr/schemas")
    public void doRespose(@RequestPayload Element request) {
        System.out.println(Context.ip.get());
    }
}
信息存储在上下文对象中。上下文使用ThreadLocal保存数据。它之所以有效,是因为每个请求都由单独的线程处理

public class Context {
    public static ThreadLocal<String> ip = new ThreadLocal<String>();
}
和web.xml

<filter>
    <filter-name>httpfilter</filter-name>
    <filter-class>so.example.MyHttpFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>httpfilter</filter-name>
    <url-pattern>/ws/*</url-pattern>
</filter-mapping>
<servlet>
    <servlet-name>SoapHost</servlet-name>
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
    <init-param>
        <param-name>transformWsdlLocations</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>SoapHost</servlet-name>
    <url-pattern>/ws/*</url-pattern>
</servlet-mapping>

httpfilter
so.example.MyHttpFilter
httpfilter
/ws/*
肥皂剧主持人
org.springframework.ws.transport.http.MessageDispatcherServlet
转换wsdllocations
真的
肥皂剧主持人
/ws/*

您建议我如何在不中断Spring WS流的情况下设置过滤器?这个过滤器是Spring特性还是我可以在servlet级别实现的特性?请提供一些示例代码/文档链接。
public class Context {
    public static ThreadLocal<String> ip = new ThreadLocal<String>();
}
public class MyHttpFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        Context.ip.set(request.getRemoteAddr());
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {}
}
<filter>
    <filter-name>httpfilter</filter-name>
    <filter-class>so.example.MyHttpFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>httpfilter</filter-name>
    <url-pattern>/ws/*</url-pattern>
</filter-mapping>
<servlet>
    <servlet-name>SoapHost</servlet-name>
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
    <init-param>
        <param-name>transformWsdlLocations</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>SoapHost</servlet-name>
    <url-pattern>/ws/*</url-pattern>
</servlet-mapping>