序列化由cglib创建的代理对象

时间:2016-01-27 08:31:59

标签: java proxy jersey jackson cglib

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

@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))(通过引用   chain:MyREST $ A $$ EnhancerByCGLIB $$ fdcf8406 [“callbacks”])

1 个答案:

答案 0 :(得分:2)

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

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