Apache CXF自定义服务列表页面

时间:2014-03-14 14:02:07

标签: web-services cxf javadoc

我有一个由apache cxf生成的网页,它通过方法向我展示了我的应用程序中所有可用的soap webservices。我还为我的webservices生成了一些javadoc。我想自定义apache cxf生成的webservices列表,因为webservice的名称是javadoc的链接,方法名称也是如此。可能吗?我不想改变apache cxf库的代码。我正在使用CXF 2.3.7版。

2 个答案:

答案 0 :(得分:1)

您可以找到ServiceListGeneratorServlet生成的serviceList。 但我认为您需要创建一个新的CXFNonSpringServlet来替换包含ServiceListGeneratorServlet的ServletController。

答案 1 :(得分:0)

您可以使用Servlet过滤器来覆盖servlet返回的响应。它不是最有效的解决方案,但您不需要对任何CXF类进行子类化。

我们的想法是将HttpServletResponseWrapper的自定义实例传递给FilterChain.doFilter方法。包装器防止servlet响应(即服务列表页面)直接写入ouptut。因此,可以稍后在过滤器内检索响应并进行修改,然后再向客户端发送。

以下示例的灵感来自The Essentials of Filters

public class DocumentationFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);

        chain.doFilter(request, wrapper);

        try (PrintWriter out = response.getWriter()) {
            if(wrapper.getContentType().startsWith("text/html")) {
                CharArrayWriter caw = new CharArrayWriter();
                // get the service list page
                String content = wrapper.toString();

                String newContent = ... // transform the service list page as needed
                caw.write(newContent);

                response.setContentLength(caw.toString().length());

                // send the response to the client
                out.write(caw.toString());
            } else {
                out.write(wrapper.toString());
            }
        }
    }

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }

    public class CharResponseWrapper extends HttpServletResponseWrapper {

        private final CharArrayWriter output;

        public CharResponseWrapper(HttpServletResponse response){
            super(response);
            output = new CharArrayWriter();
        }

        @Override
        public PrintWriter getWriter(){
            return new PrintWriter(output);
        }

        @Override
        public String toString() {
            return output.toString();
        }

    }

}

最后在你的web.xml中注册过滤器如下。您需要调整网址格式以访问服务列表页面。

<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <filter>
        <filter-name>DocumentationFilter</filter-name>
        <filter-class>org.mypackage.DocumentationFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>DocumentationFilter</filter-name>
        <url-pattern>/</url-pattern> <!-- The location of the service list page -->
    </filter-mapping>
...
</web-app>