gpt4 book ai didi

java - Spring CGLib代理-类变量变为null

转载 作者:行者123 更新时间:2023-12-02 11:11:00 29 4
gpt4 key购买 nike

我有一个过滤器服务,其方法是通过方面进行分析的。作为一个例子,我会给你一段我遇到问题的代码

    @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());

据我所知,默认情况下,如果类没有至少一个方法继承接口(interface),则将使用 CGlib 代理,并且 Cglib 通过继承来工作。
问题是这样的:当我从 Controller 调用 filterItems 方法时,调试器在此方法中显示 this - FilterService.
此外,在该方法中还引发了该类的另一个方法,该方法也应该被分析。为了使代理正常工作,我需要 self 自动连接。之后,我通过 self.initNonSpecificFilters 调用我的方法,并且在调试器中我已经看到 this - FilterService$$EnhancerBySpringCGLIB 以及我的所有变量我的类是空的,所以我得到空指针异常。

如果 CGLIb 似乎是通过继承来工作的,为什么会这样呢?为什么在第一个方法(filterItems)中this - 是一个没有CGlib的类,但是当你从它调用另一个方法(filterItems -> initNotSpecificFilters)时,cglib已经出现了。

最佳答案

问题是动态代理,无论是JDK接口(interface)代理还是CGLIB类代理,都只能继承

  • 公共(public)方法(JDK、CGLIB)或
  • protected 和包范围的方法(仅限 CGLIB)。

此外,代理不会继承任何实例变量值,因为这不是它们的目的,它们只是包装方法并调用原始值以及可能在方面建议或拦截器之前和之后。

现在您的情况如下:

  • 您的方法 initNonSpecificFilters(..)是私有(private)的。 IE。如果您调用 self ,您实际上仍然会调用原始方法(因为它没有被包装),但是代理的成员当然没有值。

  • 顺便说一句,该方法是私有(private)的,这也是为什么如果您有一个针对该方法的切入点,Spring AOP 方面不会启动该方法(使用 AspectJ 会有所不同)。

搜索Spring manual对于术语自调用,其行为有很好的记录。

解决您的问题的方法是使该方法成为非私有(private)的。

关于java - Spring CGLib代理-类变量变为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50621320/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com