私は自分の好奇心から小さなサンプルプロジェクトを作成し、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に基づく文書化された代替案が役立つ可能性があります。