Java 用Jackson映射注释

Java 用Jackson映射注释,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我试图使用Jackson库将一些注释映射到rest响应 @Retention( RetentionPolicy.RUNTIME ) @Target( ElementType.TYPE ) public @interface LogicModule { String id(); int numberOfInputs(); } 我将这些对象转换为JSON的代码是 ... final List<LogicModule> result = new LinkedList<

我试图使用Jackson库将一些注释映射到rest响应

@Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.TYPE )
public @interface LogicModule
{
    String id();
    int numberOfInputs();
}
我将这些对象转换为JSON的代码是

...
final List<LogicModule> result = new LinkedList<>();
for (final Class<?> annotatedClass : annotated)
{
   final LogicModule moduleInfo = annotatedClass.getAnnotation( LogicModule.class );
   result.add(moduleInfo);
}
return Response.ok( result ).build();
。。。
最终列表结果=新建LinkedList();
for(最终类注释类:注释)
{
最终LogicModule moduleInfo=annotatedClass.getAnnotation(LogicModule.class);
结果.添加(moduleInfo);
}
返回Response.ok(result.build();

不幸的是,这将返回一个空列表。我需要如何修改代码以使事情按预期工作?

我认为您有两个选项:要么用
@JsonProperty
注释标记注释类型的方法,要么配置一个自定义方法,将所有注释类型的方法视为普通属性

以下是一个示例,显示了以下两个方面:

public class JacksonAnnotation {

    @Retention( RetentionPolicy.RUNTIME )
    @Target( ElementType.TYPE )
    public static @interface LogicModule {
        @JsonProperty
        String id();
        @JsonProperty
        int numberOfInputs();
    }

    @Retention( RetentionPolicy.RUNTIME )
    @Target( ElementType.TYPE )
    public static @interface LogicModule2 {
        String id();
        int numberOfInputs();
    }

    @LogicModule(id = "id", numberOfInputs = 123)
    public static class AnnotatedClass {

    }
    @LogicModule2(id = "id2", numberOfInputs = 321)
    public static class AnnotatedClass2 {

    }

    public static void main(String[] args) throws JsonProcessingException {
        List<LogicModule> modules = singletonList(AnnotatedClass.class.getAnnotation(LogicModule.class));
        List<LogicModule2> modules2 = singletonList(AnnotatedClass2.class.getAnnotation(LogicModule2.class));

        ObjectMapper mapper1 = new ObjectMapper();
        System.out.println(mapper1.writerWithDefaultPrettyPrinter().writeValueAsString(modules));

        ObjectMapper mapper2 = new ObjectMapper();
        mapper2.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
            @Override
            public PropertyName findNameForSerialization(Annotated a) {
                if (a instanceof AnnotatedMethod) {
                    Class<?> declaringClass = ((AnnotatedMethod) a).getMember().getDeclaringClass();
                    // checks that this is an annotation method
                    if (Annotation.class.isAssignableFrom(declaringClass)) {
                        try {
                            // exclude the other method defined in the super interface
                            Annotation.class.getMethod(a.getName());
                        } catch (NoSuchMethodException e) {
                            return new PropertyName(a.getName());
                        }
                    }
                }
                return super.findNameForSerialization(a);
            }
        });
        System.out.println(mapper2.writerWithDefaultPrettyPrinter().writeValueAsString(modules2));
    }
}

result
是否包含任何内容?是的,它包含多个
LogicModule
[ {
  "id" : "id",
  "numberOfInputs" : 123
} ]
[ {
  "id" : "id2",
  "numberOfInputs" : 321
} ]