Spring4 MVC将枚举序列化为带引号的字符串

时间:2014-07-07 19:51:57

标签: java spring jackson

我在spring boot mvc容器中有一个休息控制器

@RestController
public class LoginController {

    @RequestMapping("rest/login")
    public Response login() {
        return Response.GRANTED;
    }

    public static enum Response {

        GRANTED, DENIED;

    }
}

在请求休息资源后,我必须使用双引号来检查返回类型。如何避免双引号?

$http.post("rest/login", $scope.data).success(function(data) {
  if (data === "\"GRANTED\"") {
   alert("GRANTED")
  } else if (data === "DENIED") {
   alert("DENIED")
  };

@RestController 公共类LoginController {

@RequestMapping("rest/login")
public String login() {
    return Response.GRANTED.name();
}

public static enum Response {

    GRANTED, DENIED;

}

}

带来我想要的结果,但我想要类型安全返回类型Response而不是String。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

@RestController就像使用@Controller注释的@ResponseBody一样。也就是说,每个处理程序都使用@ResponseBody隐式注释。对于String以外的任何引用类型(以及其他一些引用类型),默认目标内容类型为JSON。

JSON中的6种数据类型是Object,Array,Number,String,true,false和null。你如何映射enum常数?默认情况下,Jackson(支持默认JSON HttpMessageConverter)将enum常量序列化为JSON字符串。这可以说是最匹配的JSON数据类型。

您可以通过提供自己的JsonSerializer

强制它在没有引号的情况下写入值
@JsonSerialize(using = ResponseSerializer.class)
public static enum Response {
...
class ResponseSerializer extends JsonSerializer<Response> {
    @Override
    public void serialize(Response value, JsonGenerator jgen,
            SerializerProvider provider) throws IOException,
            JsonProcessingException {
        jgen.writeRaw(value.name());
    }
}

但我不推荐它,因为你不会生成有效的JSON。

您应该考虑其他人的建议并使用各种HTTP状态代码。