作为标题,我使用Jersey来将对象作为JSON返回,但是该对象是由cglib代理创建的:

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("test")
public Response test() {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(A.class);
    enhancer.setCallback(new InvocationHandler() {
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            return "my name";
        }
    });
    return Response.ok(enhancer.create()).build();
}

@Data
@XmlAccessorType(XmlAccessType.PROPERTY)
public static class A {
    private String name;
}

它不能工作,因为Enhancer.create()返回类A的代理对象,而不是类A的真实对象。

org.codehaus.jackson.map.JsonMappingException:找不到针对的序列化程序
类MyREST $ 1,未发现创建BeanSerializer的属性
(为避免异常,请禁用
SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))(通过引用
链:MyREST $ A $$ EnhancerByCGLIB $$ fdcf8406 [“callbacks”])

最佳答案

您遇到的问题是cglib创建类的子类,但不复制注释。同时,如果未显式定义注释,则不会继承注释。

Cglib不支持注释。为了克服这个问题,您可以选择使用另一个支持注释的代码生成库。我写了一个这样的库,它叫做Byte Buddy

07-26 01:13