Java 返回值为null的Spring Ajax@ResponseBody
我有大约50个使用@ResponseBody注释的控制器 像这样:Java 返回值为null的Spring Ajax@ResponseBody,java,ajax,spring,jackson,Java,Ajax,Spring,Jackson,我有大约50个使用@ResponseBody注释的控制器 像这样: @RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET) public @ResponseBody Object getObject(@RequestParam("id") Long id) { Object object = provider.getObject(id); return object; } @Reque
@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET)
public @ResponseBody Object getObject(@RequestParam("id") Long id) {
Object object = provider.getObject(id);
return object;
}
@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET)
public JsonView<Object> getObject(@RequestParam("id") Long id) {
Object object = provider.getObject(id);
return new JsonView(object);
}
有时getObject方法返回null
。问题是在客户端,我得到的是空响应,而不是null
在最初的实现中,我们有一个自定义的JsonView
对象,它作为包装器工作,不带@ResponseBody注释
像这样:
@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET)
public @ResponseBody Object getObject(@RequestParam("id") Long id) {
Object object = provider.getObject(id);
return object;
}
@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET)
public JsonView<Object> getObject(@RequestParam("id") Long id) {
Object object = provider.getObject(id);
return new JsonView(object);
}
@RequestMapping(value=“/someUrl.controller”,method=RequestMethod.GET)
public JsonView getObject(@RequestParam(“id”)长id){
Object Object=provider.getObject(id);
返回新的JsonView(对象);
}
所以它工作得很好
我在上找到了一些解决方案,但不幸的是,它只适用于POJO中的字段
你知道怎么处理吗
提前谢谢 当对象为空时,可以返回ResponseEntity并将HTTP状态指定为错误:
@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET)
public ResponseEntity<Object> getObject(@RequestParam("id") Long id) {
Object object = provider.getObject(id);
if (object == null ) {
return new ResponseEntity<Object> (HttpStatus.BAD_REQUEST); // Or any other error status
} else {
return new ResponseEntity<Object> (object, HttpStatus.OK);
}
}
@RequestMapping(value=“/someUrl.controller”,method=RequestMethod.GET)
公共响应属性getObject(@RequestParam(“id”)长id){
Object Object=provider.getObject(id);
if(object==null){
返回新的ResponseEntity(HttpStatus.BAD_REQUEST);//或任何其他错误状态
}否则{
返回新的ResponseEntity(对象,HttpStatus.OK);
}
}
通过这种方式,您的客户机将能够在检查响应状态时知道对象何时为null
如果您确实需要返回null值,可以配置Jackson将其序列化(代码来自):
非空
我希望这对你有所帮助。首先,我建议你不要这样写:
@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET)
public @ResponseBody Object getObject(@RequestParam("id") Long id) {
/*
*/
}
将其作为标准代码。试试这个:
@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET)
@ResponseBody
public Object getObject(@RequestParam("id") Long id) {
Object object = provider.getObject(id);
return object;
}
我有使用高质量扫描仪的经验,这种方式可以帮助您避免扫描仪发现的错误。关于您的问题,您可以尝试使用Transformer或addScala()返回POJO。我面对这个麻烦,做了一笔交易!祝你好运。这不是一个需要解决的小问题 Spring有一个常见的模式,其中如果处理程序方法返回
null
,则表示处理程序已经处理了生成和写入适当响应内容的问题,并且不需要在前端执行进一步的操作
Spring在其RequestResponseBodyMethodProcesser
(针对@ResponseBody
的HandlerMethodReturnValueHandler
实现)中应用了此模式。它检查返回值是否为null
。它将请求设置为已处理。如果返回值不是null
,它将尝试使用适当的HttpMessageConverter
对其进行序列化
一个选项是创建您自己的@ResponseBodyNull
注释和相应的HandlerMethodReturnValueHandler
,除了处理null
之外,它也执行相同的操作。请注意,您不必重用RequestResponseBodyMethodProcess
中的代码,因为某些HttpMessageConverters
在尝试使用null
时会失败
另一个类似的选项是覆盖RequestResponseBodyMethodProcessor
以接受null
(具有上述限制),并使用RequestMappingHandlerMapping
显式注册它,覆盖默认的HandlerMethodReturnValueHandler
s。除非你想失去功能,否则你必须小心地注册相同的
IMO,更好的解决方案是不在响应主体中处理null
。如果getObject
没有返回任何内容,我觉得这就像404。设置相应的响应代码,瞧
您始终可以将HttpServletResponse
注入到处理程序方法中,并执行如下操作
Object object = getObject(..);
if (object == null) {
response.getWriter().print("null");
// also set the content type to application/json
}
return object;
假设您知道必须将其序列化为JSON。您的意思是在方法签名下指定注释,因为这会引发“replice annotation@ResponseBody”编译错误?谢谢!不,我的意思是,不应该将注释放在方法的访问器之后和数据类型之前。用我的方式。质量扫描器(如SonarQube)将意识到这是一个重大错误,需要重构!我面对它并获得经验。这不是“重复注释”编译错误。它会正确编译,但是你应该标准化你的代码。这是一个错误吗?这可能是代码风格的观点,但绝对不是错误。而你的回答并不能回答这个问题。是的!这不是一个语法错误,但是如果你应用了质量等级。这是一个重大错误,应该纠正!如果你不相信,检查一下规则并找出原因!我不知道你所说的质量等级是什么意思,也不知道你所说的重大错误是什么意思。我知道SonarQube不喜欢将其作为其代码策略的一部分。在任何情况下,您的答案都不能解决这个问题。不幸的是,在我的情况下,任何方法都不起作用:1)第一个方法继续返回空响应,因为以下代码出现在:Object body=responseEntity.getBody();if(body!=null){writeWithMessageConverters(body,returnType,inputMessage,outputMessage);}else{//刷新HttpServletResponse outputMessage.getBody();}的头。因此,它只是将null作为privius预输入,并避免使用writeWithMessageConverters方法。您的第二个建议不起作用,因为
null
永远不会到达MappingJackson2HttpMessageConverter
,它将在RequestResponseBodyMethodProcessor
处停止。您能告诉我们这个通用JsonView
类来自哪个库吗?