【问题标题】:Serialize proxy object created by cglib序列化 cglib 创建的代理对象
【发布时间】:2016-01-27 08:31:58
【问题描述】:

作为标题,我使用 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"])

【问题讨论】:

  • 您陈述了问题,但您对答案的期望是什么?
  • @hotzst 我的期望是实现 InvocationHandler 以告诉 Jackson 库获取正确的字段和属性

标签: java proxy jersey jackson cglib


【解决方案1】:

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

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

【讨论】:

  • 我认为在“enhancer.setCallback”中我们可以实现getClass或getAnnotaion之类的东西来欺骗Jackson。我正在尝试你的库,听起来不错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多