Java Spring控制器始终生成json

Java Spring控制器始终生成json,java,spring,spring-mvc,Java,Spring,Spring Mvc,无论如何,是否有必要强制spring始终生成json,即使是在没有数据返回的情况下生成一个空的json对象。 我们的服务通过另一个服务拒绝任何无效的json响应(不管状态代码如何)。这不好,但我们无法控制 使用spring控制器,您可以告诉它们生成json,但这只在有内容返回时才起作用。有没有一种快速而优雅的方法使所有响应都是json @RequestMapping(value = "/test", method = RequestMethod.GET, produces = MediaType

无论如何,是否有必要强制spring始终生成json,即使是在没有数据返回的情况下生成一个空的json对象。 我们的服务通过另一个服务拒绝任何无效的json响应(不管状态代码如何)。这不好,但我们无法控制

使用spring控制器,您可以告诉它们生成json,但这只在有内容返回时才起作用。有没有一种快速而优雅的方法使所有响应都是json

@RequestMapping(value = "/test", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public
@ResponseBody
ResponseEntity<String> test(){
    // if this returns null or an empty string the response body will be emtpy 
    // and the content-type header will not be set.
    return service.getData();
}
@RequestMapping(value=“/test”,method=RequestMethod.GET,products=MediaType.APPLICATION\u JSON\u value)
公众的
@应答器
反应性试验(){
//如果返回null或空字符串,则响应主体将为emtpy
//并且不会设置内容类型标题。
return service.getData();
}
这里简单的解决方法是简单地添加一个if语句来检查null。但这很难看,因为我必须手动设置标题和响应主体

我希望有人知道更好的方法


谢谢

您可以将响应包装在“容器”对象中 例如,我使用此BaseAjaxResponse:

public class BaseAjaxResponse implements Serializable
{

    private static final long serialVersionUID = 9087132709920851138L;
    private int codiceOperazione;
    private String descrizioneEsitoOperazione;
    private long numeroTotaleOggetti;
    private long numeroOggettiRestituiti;
    private List<? extends Object> payload;
    //Constructors and getter/setter

}
公共类BaseAjaxResponse实现可序列化
{
私有静态最终长serialVersionUID=9087132709920851138L;
私人密码;
私有字符串描述eesitooperazione;
私人长数字耳蜗;
私人长号码;

private List您可以将响应包装在“Container”对象中 例如,我使用此BaseAjaxResponse:

public class BaseAjaxResponse implements Serializable
{

    private static final long serialVersionUID = 9087132709920851138L;
    private int codiceOperazione;
    private String descrizioneEsitoOperazione;
    private long numeroTotaleOggetti;
    private long numeroOggettiRestituiti;
    private List<? extends Object> payload;
    //Constructors and getter/setter

}
公共类BaseAjaxResponse实现可序列化
{
私有静态最终长serialVersionUID=9087132709920851138L;
私人密码;
私有字符串描述eesitooperazione;
私人长数字耳蜗;
私人长号码;

私有列表如果希望所有响应返回
application/json
,则可以通过覆盖
HandlerInterceptorAdapter
中的
postHandle()
在单个位置进行设置:

@Component
public class ResponseInterceptor extends HandlerInterceptorAdapter {

    @Override
    public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler,
            final ModelAndView modelAndView) throws IOException {
         if (response.getContentType() == null || response.getContentType().equals("")) {
            response.setContentType("application/json");
         }
     }
}

如果希望所有响应都返回
application/json
,可以查看,然后可以通过覆盖
HandlerInterceptorAdapter
中的
postHandle()
在单个位置进行设置:

@Component
public class ResponseInterceptor extends HandlerInterceptorAdapter {

    @Override
    public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler,
            final ModelAndView modelAndView) throws IOException {
         if (response.getContentType() == null || response.getContentType().equals("")) {
            response.setContentType("application/json");
         }
     }
}

你可以看看

,很遗憾,这不起作用,因为服务返回一个字符串。我正在使用许多其他服务,不幸的是,我对任何重构都非常有限。我真正需要的是将null或空字符串转换为空json对象。包装器方法的问题是它正在添加字段,而我需要一个空的json对象。那么你可以使用一个自定义的消息转换器;在这个消息转换器中,你可以随心所欲地处理json。幸运的是,当服务返回字符串时,这不会起作用。我正在处理许多其他服务,不幸的是,我在任何重构方面都非常有限。我真正需要的是使用null或空字符串c转换为空的json对象。包装器方法的问题是它正在添加字段,而我需要一个空的json对象。那么,您可以使用自定义消息转换器;在这个消息转换器中,您可以根据需要处理json,如果服务返回null/nothing,您可以抛出异常,然后使用异常处理程序来设置适当的响应和标头?如果服务返回null/nothing,则抛出异常,然后使用ExceptionHandler来设置适当的响应和标头如何?非常感谢,这正是我要找的。非常感谢,这正是我要找的。