四个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
不行。