Я пытаюсь реализовать шаблон Repository с отложенной загрузкой моих сущностей (я не могу использовать JPA, потому что это устаревшая модель БД).Чтобы лениво загрузить объекты, я использую метод cIng MethodInterceptor, чтобы перехватить метод получения объекта и динамически гидрировать соответствующее свойство.Например, в случае объекта Airport я буду лениво загружать свойство Terminals, только если вызывается соответствующий получатель.Все это упаковано как приложение для весенней загрузки.
Реализация репозитория задается следующим образом:
@Component
public class AirportsRepository implements Repository<Airport, String> {
@Autowired
private AirportMapper airportMapper;
@Autowired
private TerminalMapper terminalMapper;
private List<AirportInterceptor> airportInterceptors = new ArrayList<>();
@Override
public Airport get(String id) {
Airport airport = airportMapper.findById(id);
if(airport != null){
AirportInterceptor airportInterceptor = new AirportInterceptor(airport, terminalMapper);
airport = (Airport) Enhancer.create(Airport.class,airportInterceptor);
this.airportInterceptors.add(airportInterceptor);
return airport;
}
return airport;
}
@Override
public void add(Airport entity) {
//
}
@Override
public void remove(Airport entity) {
//
}
@Override
public void saveChanges(){
//
}
}
public class Airport
{
// ...
}
И перехватчик метода:
class AirportInterceptor implements MethodInterceptor {
private TerminalMapper terminalMapper;
private Airport airport;
public AirportInterceptor(Airport airport, TerminalMapper terminalMapper){
this.airport = airport;
this.terminalMapper = terminalMapper;
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
if(method.getName().equals("getTerminals") && method.invoke(obj, args) == null){
// Hydrate terminals
List<Terminal> terminals = terminalMapper.findByAirportCode(airport.getId());
airport.setTerminals(terminals);
}
return method.invoke(obj, args);
}
public void saveChanges(){
//airportMapper.update(this.airport);
}
}
Однако яУ меня проблема с кодом репозитория, когда я вызываю Enhancer.create (), что вызывает загадочное исключение в отношении метода toString ():
Method threw 'java.lang.reflect.InvocationTargetException' exception. Cannot evaluate com.apm.airportservice.entities.Airport$$EnhancerByCGLIB$$d0daae41.toString()