四个class类似如下
public abstract class DefaultSimpleFirmwareServiceImp implements SimpleFirmwareService {
private JVMCacheWrap<Map<Integer, List<SimpleFirmware>>> firmwareCache;
protected abstract SimpleFirmwareRepository getFirmwareRepository();
protected final JVMCacheWrap<Map<Integer, List<SimpleFirmware>>> getCache() {
return firmwareCache;
}
protected final void initService(String moduleKey, int[] hardwares) {
firmwareCache = JVMCacheFactory.create(balabala...);
}
public abstract void init();
public final void saveFirmware(SimpleFirmware firmware) throws Exception {
getFirmwareRepository().saveFirmware(firmware);
getCache().stale();
}
}
@Component
@Qualifier("goFirmwareService")
public class GoFirmwareServiceImp extends DefaultSimpleFirmwareServiceImp implements GoFirmwareService {
@Override
protected SimpleFirmwareRepository getFirmwareRepository() {
return balabala...;
}
@Override
@PostConstruct
public void init() {
initService("go", new int[] { 1 });
}
}
public abstract class SimpleFirmwareAdminAction extends BaseAction {
protected abstract SimpleFirmwareService findFirmwareService();
public String firmware_save() throws Exception {
findFirmwareService().saveFirmware(getParameterBean(new SimpleFirmware()));
return NONE;
}
balabala...
}
@Controller
public class GoAdminAction extends SimpleFirmwareAdminAction {
private static final long serialVersionUID = 6955716525662800331L;
@Autowired
private GoFirmwareService goFirmwareService;
@Override
protected SimpleFirmwareService findFirmwareService() {
return goFirmwareService;
}
balabala...
}
structs 调用 GoAdminAction 的 firmware_save 的方法,最终调用了DefaultSimpleFirmwareServiceImp.saveFirmware方法,但是getCache()方法返回了NULL,出现了空指针异常
但是initService被GoFirmwareServiceImp在初始化的时候调用了,firmwareCache的值不应该为空
没有setCache方法,所以不会出现其他地方又置为NULL的情况
应该不是父类属性修饰符的问题
DEBUG部分截图
-
GoFirmwareServiceImp.init()调用了DefaultSimpleFirmwareServiceImp.initService()方法
-
GoFirmwareServiceImp.init()调用结束
- 向API发送数据,Controller的
SimpleFirmwareAdminAction.firmware_save()方法被调用
-
SimpleFirmwareAdminAction.firmware_save()方法调用子类的GoAdminAction findFirmwareService()的方法
- 然后
findFirmwareService()返回了service,并调用了DefaultSimpleFirmwareServiceImp. saveFirmware()方法,该方法调用了getCache方法,出现了NULL,如图
由于cglib代理原因导致的,解决方法是 原来的
protected final改为public就OK了,只改修饰符为public不行。