6 回答

TA貢獻1776條經驗 獲得超12個贊
最簡單的方法是通過默認 JSON 庫 Jackson 提供的注釋來控制 JSON 的序列化。
https://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonIgnore.html
@JsonIgnore
@Column(name = "password")
private String password;
您還可以通過 Jackson mixin 來執行此操作,以避免 JSON 處理指令“污染”實體。

TA貢獻1765條經驗 獲得超5個贊
實際上,jpa查詢中有一種方法只返回特定字段,這樣您就可以在獲取結果時直接使用。
但如果您不想干擾 findByUsername 方法,只需創建 User 類的對象并僅設置所需的字段即可。
您目前使用的方法也是可行的解決方案。

TA貢獻1802條經驗 獲得超5個贊
如果您想從響應中排除密碼,請使用 注釋密碼字段@JsonIgnore
。
如果您想排除實體中的多個字段User
,請創建一個UserDto
類并在該類中添加所需的字段UserDto
。
用于ModelMapper
將用戶實體映射到UserDto
類。最后返回這個 UserDto 類作為響應對象。
例子:
User user = new User(); UserDto userDto = new ModelMapper.map(user, UserDto.class);
這將僅包括 UserDto 中的字段

TA貢獻1946條經驗 獲得超4個贊
除了已經提到的回復之外,還有其他一些方法,例如 JsonIgnoreProperties、JsonIgnoreType、JsonFilter。我更喜歡 JsonIgnore 來抑制輸出中的字段。
此外,您始終可以創建一個單獨的 POJO 類來返回所需的值。

TA貢獻1853條經驗 獲得超9個贊
因此,有兩種不同的方法可以解決這個問題。
transient
在您的實體類中創建密碼字段。
這樣,當您獲取 Users 對象時,密碼字段將為空。
缺點:使密碼成為臨時密碼將導致您無法通過應用程序中任何位置的實體獲取密碼。
在密碼字段上使用
@JsonIgnore
(來自杰克遜庫)。這樣,當您返回 Users 對象的對象時,密碼字段將被忽略。
缺點:這再次意味著,如果您想在整個應用程序中將密碼字段作為輸入或返回密碼字段,您將無法這樣做。另外,不建議您返回 POJO 類的對象作為響應。
因此,您可以選擇任何一種方法,同時記住每種方法的缺點。

TA貢獻1798條經驗 獲得超3個贊
這里典型的最佳實踐是將密碼視為子資源:邏輯上不是用戶資源的直接部分,但與其相關(例如,它可能有自己的 URL?/users/{id}/password
)。當您具有 JPA 關系時,Spring Data REST 會自動處理此問題@OneToOne
,但您自己處理也沒有問題。
此示例說明了為什么直接使用類作為 JSON API 表示不是一個好主意@Entity
,因為您可能希望在內部存在差異(包括將來進行更改而不打擾客戶端)。相反,請使用充當實體的“JSON 副本”的數據傳輸對象(DTO)。像MapStruct這樣的工具使得在User
和之間復制屬性變得非常簡單UserDto
。
(最后,如果您確實發現自己由于某些奇怪的原因需要返回裸機Map
(這種情況確實發生了),那么為了簡單起見,通常最好使用它Map.of("key", value)
。)
添加回答
舉報