前后端交互中出现空指针异常(NULL)的一次问题记录

问题描述

在写品优购的项目时候,做到了规格管理,在添加规格,并保存的时候返回了错误信息。
前后端交互中出现空指针异常(NULL)的一次问题记录_第1张图片

同时在后端,我们发现报了空指针异常的错误:

java.lang.NullPointerException
	at com.pinyougou.sellergoods.service.impl.SpecificationServiceImpl.add(SpecificationServiceImpl.java:59)
	at com.alibaba.dubbo.common.bytecode.Wrapper15.invokeMethod(Wrapper15.java)
	at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)
	at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
	at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
	at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)

按照错误的提示,我去找SpecificationServiceImpl,提示说是下面这段代码出现了空指针的情况:

for(TbSpecificationOption specificationOption:specification.getSpecificationOptions()){
            specificationOption.setSpecId(specification.getSpecification().getId());//设置规格ID
			specificationOptionMapper.insert(specificationOption);
        }

上面这段代码的作用是for循环找出specification中的SpecificationOptions,并将它的SpecId赋值,插入到数据库中去。但是出现了空指针,那就意味这specification中的SpecificationOptions是空的,这个值又是从前端传过来的,接下来就需要在controller层中查看前端传过来的值的情况。

specification这个类中包含了 Specification 和 SpecificationOptions,Specification是规格的一些属性,而SpecificationOptions是规格选项的属性,它是一个List的集合。

下面这段是添加规格的代码:

/**
	 * 增加
	 * @param specification
	 * @return
	 */
	@RequestMapping("/add")
	public Result add(@RequestBody Specification specification){
		try {
			specificationService.add(specification);
			return new Result(true, "增加成功");
		} catch (Exception e) {
			e.printStackTrace();
			return new Result(false, "增加失败");
		}
	}

对它进行调试发现在specificationSpecification的值是正常的,但是SpecificationOptions传过来的是空值,所以才会报空指针异常。而前端代码也没有什么问题,可能是前后端交互的时候出现了一些小的错误。
前后端交互中出现空指针异常(NULL)的一次问题记录_第2张图片
经过仔细排查(虽然废了好长时间),发现了问题,原来是前后端的规格选项的名字不一致导致的问题。在前端中,规格选项的名字是specificationOptionList,而在后端中,规格选项的名字是SpecificationOptions。那么在前端把规格选项这个数据发送给后端specification这个类的时候,找不到对应的名字,就无法赋值,那么后端的规格选项就为空。

解决方法

把前后端的规格选项名字改为一致的,这样问题就得到了解决。

你可能感兴趣的:(web方面)