/ / Marshalling java proxy - java, proxy, jaxb

Marshalling java proxy - java, proxy, jaxb

Czy ktoś może zaproponować podejście do zestawiania i unmarshalling obiektów proxy Javavaasyst. Chciałbym mieć coś takiego jak JAXB lub xstream. Obecnie widzę tylko jeden sposób na rozwiązanie tego problemu

  • utwórz płaską klasę, która obsługuje te same atrybuty co proxy (jest to problem, ponieważ mam około 300 atrybutów)
  • napisz trochę refleksji do właściwości mapy (lub używa czegoś takiego jak DOZER) (może to być powolne i nieefektywne)
  • użyj xstream do serializacji mapera użycia obiektu, aby przenieść proxy -> płaskie -> xml lub xml -> płaskie -> proxy

Takie podejście wydaje się nieskuteczne, czy ktoś ma lepsze pomysły?

Odpowiedzi:

0 dla odpowiedzi № 1

Jeśli klasa bazowa ma adnotacje z adnotacjami Jackson json, to fakt, że jest to serwer proxy, nie ma wpływu na porządkowanie. Oto przykład uporządkowania obiektu proxy jako JSON.

import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.ProxyFactory;
import javassist.util.proxy.ProxyObject;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;

import java.lang.reflect.Method;

public class Main {

public static void main(String[] args){
try {
Bar bar = create(Bar.class);
bar.setBar("something");
ObjectMapper mapper = new ObjectMapper();
String out = mapper.writeValueAsString(bar);
Bar inBar = mapper.readValue(out, bar.getClass());
System.out.println("Unmarshalled: " + inBar.getClass().getName() + " , bar: " + inBar.getBar());
} catch (Exception e) {
e.printStackTrace();
}

}
public static <T> T create(Class<T> classs) throws Exception {
ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(classs);
Class clazz = factory.createClass();
MethodHandler handler = new MethodHandler() {

@Override
public Object invoke(Object self, Method overridden, Method forwarder,
Object[] args) throws Throwable {
System.out.println("I could be used for AOP "+overridden.getName());
return forwarder.invoke(self, args);
}
};
Object instance = clazz.newInstance();
((ProxyObject) instance).setHandler(handler);
return (T) instance;
}
}

class Bar{
@JsonProperty
private String bar = "bar";

String getBar() {
return bar;
}

void setBar(String bar) {
this.bar = bar;
}
}