java - 自动将 Spring @RequestMapping 注释记录到一个位置?

标签 java spring spring-mvc annotations documentation-generation

Javadoc 非常适合扫描所有源文件并创建 HTML 页面来查看它。我想知道是否有一个类似的工具可以遍历所有 Spring Controller 并收集所有已用 @RequestMapping 注释的方法并生成一个列出它们的 HTML 页面。有点像开发人员的伪站点地图,以确保跨 Controller 的唯一性和标准化。

如果这个问题已经在其他地方被问到,我深表歉意。我想不出一组合适的搜索词来提供有用的结果。

最佳答案

这是一个很好的问题,我经常错过(并实现)这样的功能。

使用构建工具

我要做的是运行 Maven(或 ant)并在编译后执行一个任务

  • 读取所有类(可能带有可配置的包列表)
  • 遍历这些类的所有方法
  • 阅读注释
  • 并将输出写入 HTML

使用注解处理

但我想这是一个场景,其中 annotation processing也可能是一种方法。通常,您必须使用一些内部 API 才能在 API 中完成工作,但使用 Filer.createResource(...)实际上应该可以开箱即用。

这是一个基本的实现:

public class RequestMappingProcessor extends AbstractProcessor{

    private final Map<String, String> map =
        new TreeMap<String, String>();

    private Filer filer;

    @Override
    public Set<String> getSupportedAnnotationTypes(){
        return Collections.singleton(RequestMapping.class.getName());
    }

    @Override
    public synchronized void init(
        final ProcessingEnvironment processingEnv){
        super.init(processingEnv);
        filer = processingEnv.getFiler();
    }

    @Override
    public boolean process(
        final Set<? extends TypeElement> annotations,
        final RoundEnvironment roundEnv){

        for(final TypeElement annotatedElement : annotations){
            final RequestMapping mapping =
                annotatedElement.getAnnotation(
                    RequestMapping.class
                );
            if(mapping != null){
                addMapping(mapping, annotatedElement, roundEnv);
            }
        }
        assembleSiteMap();
        return false;
    }

    private void assembleSiteMap(){
        Writer writer = null;
        boolean threw = false;
        try{
            final FileObject fileObject =
                filer.createResource(
                    StandardLocation.CLASS_OUTPUT,
                    "html", "siteMap.html"
                );
            writer = fileObject.openWriter();
            writer.append("<body>\n");
            for(final Entry<String, String> entry : map.entrySet()){
                writer
                    .append("<a href=\"")
                    .append(entry.getKey())
                    .append("\">")
                    .append("Path: ")
                    .append(entry.getKey())
                    .append(", method: ")
                    .append(entry.getValue())
                    .append("</a>\n");
            }
            writer.append("</body>\n");

        } catch(final IOException e){
            threw = true;
            throw new IllegalStateException(e);
        } finally{

            // with commons/io: IOUtils.closeQuietly(writer)
            // with Guava: Closeables.close(writer, rethrow)
            // with plain Java this monstrosity:
            try{
                if(writer != null){
                    writer.close();
                }
            } catch(final IOException e){
                if(!threw){
                    throw new IllegalStateException(e);
                }
            } finally{
            }
        }
    }

    private void addMapping(final RequestMapping mapping,
        final TypeElement annotatedElement,
        final RoundEnvironment roundEnv){
        final String[] values = mapping.value();
        for(final String value : values){
            map.put(
                value,
                annotatedElement.getQualifiedName().toString()
            );
        }
    }

}

关于java - 自动将 Spring @RequestMapping 注释记录到一个位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4829774/

相关文章:

java - Spring -Data MongoDB问题与作为接口(interface)的字段

java - 文本转语音保存到音频文件,静音(长时间停顿)

java - 我如何在 cucumber Stepdefs 中模拟第三方?

Java Spring MVC 集成测试创建 OAuth2 主体

java - 如何更改 java Path 对象的值?

java - Spring 批处理 : get list of defined jobs at runtime

Spring MVC - 从所有拦截器中排除 Assets

java - Spring MVC 中 Controller 方法的参数

java - Spring REST 文档 : how to replace parameters

java - 为什么此转换不生成编译器警告?