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