2016-01-14 60 views
0

我正在使用提供JSON響應的Spring Web服務REST API。Spring Web服務REST API JSON響應始終包含布爾值

的API使用:

@ResponseBody 
    @RequestMapping(value="/user", method = {RequestMethod.POST}) 
    Details user(@RequestParam("username") 
    String username, @RequestParam("password") String password) 

未來的JSON是:

{ 
    "result":{ 
    "details" : { 
     "firstName":"My", 
     "lastName":"God", 
     "enabled": false, 
     "id":927878192, 
     "language":"en_US", 
    } 
    } 
} 

我有與gettersetter方法firstNamelastNameenabled一個細節類, idlanguage

該課程註解爲@JsonIgnoreProperties(ignoreUnknown = true)

但是我不想在JSON響應中顯示languageenabled

所以在我的Java代碼,我做了language如下:

details.setLanguage(null);

這工作得很好。

但我不能做details.setEnabled(null)因爲enabled變量是原始的,可以採取truefalse但不null。所以我的JSON響應總是有"enabled": false

可以做些什麼,以便該字段不會成爲JSON響應的一部分。

回答

1

嘗試在字段級別使用@JsonIgnore註釋。 例如:

@JsonIgnore 
private boolean isActive; 
+0

如果我的另一API要顯示'響應isActive'什麼?這個註釋會忽略來自其響應的字段? –

+0

閱讀我的其他回覆。通過指定的註釋,您將能夠得到您想要的。 :) – Rozart

0

@JsonIgnoreenabled getter方法。

如果您只想在序列化期間忽略它,但反序列化時需要它(如果您需要從REST API的某種方法編輯該字段),則可以使用@JsonSetter("enabled")註釋已啓用的setter方法。

例子:

public class Details { 
    .... 
    private boolean enabled; 

    ... 

    @JsonIgnore 
    public boolean isEnabled() 

    @JsonSetter 
    public void setEnabled(boolean enabled) 

} 

如果你啓用了一些API方法需要和別人沒有,這樣做最徹底的方法是有兩個DTO的:

public class DetailsBasic { 
    private String firstName; 
    private String lastName; 
    private long id; 

    // getters and setters 
} 


public class Details extends DetailsBasic { 
    private boolean enabled; 
    private boolean language; 

    // getters and setters 
} 

然後在你的控制器:

@ResponseBody 
@RequestMapping(value="/user", method = {RequestMethod.POST}) 
DetailsBasic user(@RequestParam("username") 
String username, @RequestParam("password") String password) { 
    return ... 
} 

@ResponseBody 
@RequestMapping(value="/otherMethod", method = {RequestMethod.POST}) 
Details otherMethod(@RequestParam("username") 
String username, @RequestParam("password") String password) { 
    return ... 
} 
1

如果你想忽略該屬性只爲選定的迴應,我建議使用從com.fasterxml.jackson.annotation包,但它可能是一個矯枉過正。

首先,你需要創建一個內部接口的類:

public class View { 
    public interface UserDetailed {} 
} 

之後,你在你的類指定字段應該只對特定的「個人資料」可見:

public class User { 
    // Other fields 
    @JsonView(View.UserDetailed.class) 
    private List<Role> roleCollection = new ArrayList<Role>(); 
    // Other fields, getters and setters 
} 

然後在控制器上需要顯示該屬性的方法:

@Controller 
public class UserController{ 
    @RequestMapping(value = "/userWithRoles", method = RequestMethod.GET) 
    @JsonView(View.UserDetailed.class) 
    public User getUserWithRoles() {…} 

    @RequestMapping(value = "/userWithoutRoles", method = RequestMethod.GET) 
    public User getUserWithoutRoles() {…} 
} 

Th結果是:只有與該字段具有相同@JsonView的控制器方法纔會顯示它。其他人會忽略它。它允許您根據用例管理字段的可見性。

在這裏,你可以閱讀更多關於它: http://wiki.fasterxml.com/JacksonJsonViews

+0

我應該在哪個類中指定需要可見的字段 - 查看類OR bean類?我試圖在視圖類中指定,但對所有API仍然可見。 –

+0

我已編輯帖子。一探究竟。 :)在你的情況下,該字段應該在'Details'類中註釋。 – Rozart

+0

什麼應該是User類和UserController類的@JsonView註釋包?我爲用戶使用'com.fasterxml.jackson.annotation.JsonView'作爲'UserController'和'org.codehaus.jackson.map.annotate.JsonView'。然後運行API,它給404未找到。 –