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