【问题标题】:Spring4 MVC serialize enum as string with quotesSpring4 MVC 将枚举序列化为带引号的字符串
【发布时间】:2014-07-07 19:51:57
【问题描述】:

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

@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 公共类登录控制器 {

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

public static enum Response {

    GRANTED, DENIED;

}

}

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

感谢您的帮助。

【问题讨论】:

  • 您是否考虑过返回 HTTP 状态码?
  • 我做到了。它类似于带有 null 的代码。一方面,您将 null 解释为没有值。另一方面,它可能是意外的运行时错误。我想要一个总是返回成功状态码的架构。如果发生了真正的意外情况,我将收到一个真正的错误状态代码,我可以在 javascript 控制台上看到它。
  • 存在许多不同的状态,这是有充分理由的。服务器中的意外运行时错误将导致错误 500 的响应。返回错误 400(错误请求)或 401(未经授权)以清楚地表明实际的功能错误。这与依赖 null 来表示错误完全不同,这就是应该使用 HTTP 的方式。
  • 控制器正在返回 JSON,因此您应该使用 JSON.parse(data) 解析它。这将返回“GRANTED”或“DENIED”,因此alert(JSON.parse(data)) 的行为与您的代码相同。

标签: java spring jackson


【解决方案1】:

@RestController 类似于带有@ResponseBody 注释的@Controller。也就是说,每个处理程序都使用@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 状态代码。

【讨论】:

  • 我会考虑你的帖子。您的代码示例朝着正确的方向发展。是否有允许为所有枚举配置杰克逊序列化的机制?
  • @asmsys 不是。查看 Jackson 的 EnumSerializer 以了解他们是如何做到的,但据我所知,它是基础设施的一部分。这意味着将很难改变。我不知道适用于所有枚举的解决方法。
猜你喜欢
  • 2019-11-28
  • 2020-03-24
  • 2012-02-27
  • 2011-01-08
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
相关资源
最近更新 更多