当前位置: 首页 > 知识库问答 >
问题:

在查找控制器方法的批注时,RequestMapping批注导致空的RequestMethod数组

农存
2023-03-14

我们正在构建某种自动自描述REST服务(实时文档生成)。为此,我们有一个控制器方法,它查找所有控制器beans,并获取请求映射信息,以便在一个友好的html页面中显示它们。

为此,我们使用 MetadataReader(通过 CachingMetadataReaderFactory 创建)来获取类的元数据。当我们获取公共方法的 MethodMetaData 时,我们会找到 RequestMapping 注释以及 produce 和 value 参数,但方法字段始终是一个空数组,尽管我们在源代码中配置了它并且映射有效。所以信息应该在某个地方。这真是令人费解!:-)

编辑:方法字段为空=

我试图在Spring框架源代码中找到原因,但至今没有找到原因…

有什么想法吗?

仅供参考:我们使用Spring 3.1

共有2个答案

刁浩言
2023-03-14

这不是对您所要求的直接回答,但却是对REST API进行自文档化的非常好的方法。使用Rossen Stoyanchev在他的github位置中描述的endpoint留档控制器:https://github.com/rstoyanchev/spring-mvc-31-demo.git

总而言之,您的控制器看起来像这样:

@Controller
public class EndpointDocController {

    private final RequestMappingHandlerMapping handlerMapping;

    @Autowired
    public EndpointDocController(RequestMappingHandlerMapping handlerMapping) {
        this.handlerMapping = handlerMapping;
    }

    @RequestMapping(value="/endpointdoc", method=RequestMethod.GET)
    public void show(Model model) {
        model.addAttribute("handlerMethods", this.handlerMapping.getHandlerMethods());
    }

}

并且您的jsp会以这种方式引用方法、产生、消费、方法签名的属性,假设hm是一个处理程序方法:

Patterns:${hm.key.patternsCondition.patterns}
Method: ${hm.key.methodsCondition.methods}
Method signature: ${hm.value}
Consumes: ${hm.key.consumesCondition.expressions}
Produces: ${hm.key.producesCondition.expressions}
夏侯元忠
2023-03-14

出于自己的好奇心,我创建了一个小示例项目,并稍微摆弄了一下Spring提供的MetadataReader。对于演示,我创建了一个非常简单的控制器,如下所示:

@Controller
public class SomeAnnotatedController {

   @RequestMapping(method = {RequestMethod.GET}, value = "/someUrl")
   public void someMethod() {
       // do something later
   }

}

我无法使用SpringMetadataReader从注释中提取正确的信息。

@Test
public void shouldReturnMethodArrayWithSpringMetadataReader() throws Exception {
    MetadataReader metadataReader = new CachingMetadataReaderFactory().getMetadataReader(SomeAnnotatedController.class.getName());
    Set<MethodMetadata> annotatedMethods = metadataReader.getAnnotationMetadata().getAnnotatedMethods(RequestMapping.class.getName());
    assertEquals(1, annotatedMethods.size());
    MethodMetadata methodMetadata = annotatedMethods.iterator().next();
    assertEquals("someMethod", methodMetadata.getMethodName());
    Map<String, Object> annotationAttributes = methodMetadata.getAnnotationAttributes(RequestMapping.class.getName());
    assertTrue(annotationAttributes.containsKey("method"));
    RequestMethod[] methodAttribute = (RequestMethod[]) annotationAttributes.get("method");
    assertEquals(1, methodAttribute.length);
}

运行此测试在最后一行失败并告诉您这是一个空数组…

java.lang.AssertionError: 
Expected :1
Actual   :0

用本机Java做同样的事情感觉容易一点,并返回正确的信息。

@Test
public void shouldReturnMethodArrayWithPlainJava() throws Exception {
    Method method = SomeAnnotatedController.class.getDeclaredMethod("someMethod");
    RequestMapping annotation = method.getAnnotation(RequestMapping.class);
    assertEquals(1, annotation.method().length);
    assertEquals(RequestMethod.GET, annotation.method()[0]);
}

所以我很抱歉地告诉你,我没有找到这个问题的解决方案,但是也许示例项目或者基于普通java的文档化的替代方案可能会有所帮助。

 类似资料:
  • 我从Spring Boot开始,并尝试提供Rest服务。我正在编写一个控制器,其中有3个方法的RequestMappings。其中两个工作正常,而第三个注释在编写代码时给出了这个错误。 此行有多个标记 - 语法错误,插入“枚举标识符”以完成枚举标头 - 语法错误,插入“枚举正文”以完成枚举声明 我尝试了其他答案,但似乎找不到问题所在。这是我的控制器代码- } 错误出现在最后一行,即最后一个请求映射

  • 我在Java看到一些方法宣称为: 这里的是什么意思?这是否意味着输入可能是? 没有注释,输入仍然可以是空的,所以我想这不只是它吗?

  • 我正在研究Dispatcher Servlet代码。在这里,我发现调度程序servlet使用HandlerMap来选择请求的处理程序。此外,Request estMappingHandlerMap用作HandlerMap的实现。现在,如果考虑的bean具有@Controller或@Request estMap注释,则isHandlerMethod of Request estMappingHand

  • 我希望在没有参数的方法上有注释。在这种情况下,我使用@Cacheable,如下所示 然而,当我调用这个方法时,它没有被执行,而是得到了如下的异常 org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): 在 'org.springframework.cache.interceptor.CacheExp

  • 我已经多次清理编译了这个项目,处理器从来没有看到值。我在这里忽略了什么?处理器显然可以看到注释本身,但传递给它的参数是隐藏的。

  • 我是一名学生,我对symfony和stackoverflow非常陌生,如果我犯了一些错误,请原谅。 以下是我尝试访问页面时出现的错误: [语义错误]方法AppBundle\Controller\FormController::newAction()中的注释“@Route”从未导入。您是否忘记为该注释添加“use”语句?在/home/buddy/bamber/realbaumber/src/AppB