出于自己的好奇心,我创建了一个小示例项目,并对 Spring 提供的 MetadataReader 进行了一些操作。对于演示,我创建了一个非常简单的控制器,如下所示:
@Controller
public class SomeAnnotatedController {
@RequestMapping(method = {RequestMethod.GET}, value = "/someUrl")
public void someMethod() {
// do something later
}
}
我无法使用 Spring MetadataReader 从注释中提取正确的信息。
@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 的文档替代方案可能会有所帮助。