2017-03-03 54 views
3

如果我有一个控制器,它接受一个整数如,可以是null作为这样验证是否弹簧控制器参数不为空

someFunc(...,... 
    @RequestParam(required=false) Integer integerObjThatCanBeNull,...){ 
    return anotherFunc(...,integerObjThatCanBeNull...); 
} 

一个参数,然后传递integerObjThatCanBeNull到anotherFunc这样

someFunc(..., int integerPrimitiveThatCanBeNull...){... 

最初传入时,如果integerObjThatCanBeNull为null或不是,我该如何检查someFunc?

+0

你不能做一个简单的if(integerPrimitiveThatCanBeNull == null)? –

+0

“运算符==未定义为参数类型int,null” 是我在尝试此操作时收到的错误 –

回答

1

的问题是,因为你是在拆箱您的原始请求的整数到intsomeFunc,你不能做一个原始的空校验。

做到这一点

someFunc(..., Integer integerPrimitiveThatCanBeNull) 
if(integerPrimitiveThatCanBeNull== null) 

注意

在原代码,当null从服务进来,传递给someFunc,它会抛出NullPointerException因为你试图Autobox空价值分成int。在提供的解决方案中,如果在执行if语句中的逻辑后没有返回,则可以获得NullPointerException

+0

是唯一的选择吗?我不想通过将类型更改为Integer –

+1

来破坏其他代码。相反,您通过在此处添加对空值的检查来修复潜在的空指针。将null自动装箱到int将破坏呼叫。 – rob

+0

@rob,但这不是他们面临的同一个问题,因为他们在服务中获得Integer,然后将Autoboxing插入到方法中?我解释过这样做,因为他似乎无法在someFunc之外执行检查。但是,你是正确的null的自动装箱会导致问题。我会补充说明。 –

2

您可以将您的参数更改为Integer并执行简单的空检查。如果你的参数是int类型的,那么你不会在这里得到一个空值,而是一个例外。实际上“int integerPrimitiveThatCanBeNull”是一个相当有趣的声明。

-1

必须检查integerObjThatCanBeNull!= null当你调用这个函数

someFunc(..., int integerPrimitiveThatCanBeNull...){... 
+0

这不起作用,因为您无法检查原始对象 –

+0

@EduardoDennis:看起来他是在说在调用'anotherFunc'之前检查它。第一个函数需要一个'Integer',所以有一个空检查的机会。 –

1

您可以返回前一个简单的空检查。 否则,如果您希望自己的代码更清洁,则可以使用defaultValue,例如,如果整数为null,则强制为0。 如果它不能为空,那么你可以将'require'改为true。

你甚至可以两者都做这样的

@RequestParam(required=true, defaultValue=0) 
+0

不会工作,在方法someFunc他wouldnt能够确定用户发送0或它是默认的。 –

+0

这就是为什么我说他可以进行空检查或将其设置为0作为默认值。如果在他的情况下,他意识到0不能被用户选择,那么他就会知道出了什么问题......只是展示了@ RequestParam的功能:) – OEH