2014-07-07 29 views
0

我在Spring MVC啓動容器Spring4 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; 

} 

}

帶來我想要的結果,但我想要的類型安全返回類型響應,而不是字符串。

感謝您的幫助。

+2

您是否考慮過返回HTTP狀態碼? – whirlwin

+0

我做到了。它類似於具有null的代碼。一方面你把null解釋爲沒有價值。另一方面,它可能是一個意外的運行時錯誤。我想要一個始終返回成功狀態代碼的體系結構。如果出現真正意想不到的情況,我會收到一個真正的錯誤狀態碼,我可以在javascript控制檯上看到它。 –

+0

存在許多不同的狀態,這是有原因的。服務器中的意外運行時錯誤將導致出現錯誤500的響應。返回錯誤400(錯誤請求)或401(未經授權)以清楚地標示實際功能錯誤。這完全不同於依靠null來表示錯誤,並且它應該如何使用HTTP。 –

回答

1

A @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狀態代碼。

+0

我會考慮你的帖子。您的代碼示例朝着正確的方向發展。是否有一種機制可以爲所有枚舉配置jackson序列化? –

+0

@asmsys不是。看看傑克遜的EnumSerializer,看他們是怎麼做的,但據我所知,它是基礎設施的一部分。這意味着它將很難改變。我不知道適用於所有枚舉的解決方法。 –

相關問題