У меня есть служба фильтрации, методы которой представлены в аспекте.В качестве примера я приведу фрагмент кода, в котором у меня есть проблема
@Service
public class FilterService extends AbstractService {
private static final Logger log = LoggerFactory.getLogger(FilterService.class);
@Autowired
//Proxy to profiling class
private FilterService self;
private final ItemsRepository itemsRepository;
private final Map<String, EnumFilter> enumFilters;
public FilterService(ReadWriteLock readWriteLock,
ItemsRepository itemsRepository,
CategoryRepository categoryRepository, ItemsMapper itemsMapper,
CharacteristicsRepository characteristicsRepository,
List<EnumFilter> enumFilters) {
super(readWriteLock.readLock());
this.itemsRepository = itemsRepository;
this.enumFilters = enumFilters.stream().collect(Collectors.toMap(EnumFilter::getId, y -> y));
}
@Profileable
public ItemsViewShared filterItems(@Nullable String categoryId,
@NotNull Set<String> ids,
@NotNull Lang lang,
@NotNull SortType sortType,
@NotNull FilterInfo filterInfo) {
try {
this.readLock.lock();
final ItemsViewShared itemsViewResponse = new ItemsViewShared(); //in this line inspector show this = FilterService
List<Filter> allFilters = self.initNonSpecificFilters(lang, filterInfo); //problem is here
//some code...
@Profileable
private List<Filter> initNonSpecificFilters(@NotNull Lang lang, @NotNull FilterInfo filterInfo) {
final List<NumericFilter> allNumericNonSpecific = NumericFilter.getAllNonSpecific(lang, filterInfo);
//in this line enumFilters - null
final List<EnumOptionFilter> allEnumNonSpecific = enumFilters.values().stream()
.flatMap(x -> x.getAllOptions(lang, filterInfo).stream())
.collect(Collectors.toList());
Как я знаю, по умолчанию, если класс не наследует интерфейс хотя бы с одним методом, прокси CGlibи Cglib работает через наследование.
Проблема заключается в следующем: когда я вызываю метод filterItems из контроллера, отладчик показывает в этом методе, что this - FilterService .
Далее в этом методе вызывается другой метод этого класса, который тоже должен быть профилирован.Для того, чтобы прокси работал, мне нужно самостоятельно подключиться.После этого я вызвал мой метод через self.initNonSpecificFilters , и в отладчике я уже вижу, что this - FilterService $$ EnhancerBySpringCGLIB и все мои переменные в моем классе - этоnull, поэтому я получаю исключение нулевого указателя.
Почему так, если CGLIb работает через наследование?И почему в первом методе (filterItems) этот - был классом без CGlib, но когда вы вызываете из него другой метод (filterItems -> initNotSpecificFilters), уже появляется cglib.