Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回值为null的Spring Ajax@ResponseBody_Java_Ajax_Spring_Jackson - Fatal编程技术网

Java 返回值为null的Spring Ajax@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

我有大约50个使用@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);
}
有时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
类来自哪个库吗?