java - 序列化 cglib 创建的代理对象

标签 java proxy jersey jackson cglib

如标题所示,我使用 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: No serializer found for class MyREST$1 and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: MyREST$A$$EnhancerByCGLIB$$fdcf8406["callbacks"])

最佳答案

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

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

关于java - 序列化 cglib 创建的代理对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35032214/

相关文章:

java - 如何在 Android Activity 中从位图创建 Blob?

http - X-Forwarded-Host header 的实际用法?

mod-rewrite - nginx 代理和 404 重定向

iOS Libcurl 代理 C++

jersey - 在 Resources 中的 ContainerRequestFilter 中创建的访问对象

java - 输出大量数据最快的方法是什么?

java - 在 BufferedImage 的选定区域应用过滤器

java - Salesforce SOAP api 客户端 ID

java - 如何增加 Java 堆栈跟踪转储的显示行数?

rest - JAX-RS @PathParam 注入(inject)类成员变量?