Приложение Spring Boot с Cglib создает исключение InvocationTargetException - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь реализовать шаблон 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()

1 Ответ

0 голосов
/ 16 мая 2018

Как настроен класс Enhancer?

Возможно, вам понадобится добавить эту аннотацию на уровне класса:

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)

...