亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Spring Boot 從類中僅返回幾種類型?

如何使用 Spring Boot 從類中僅返回幾種類型?

偶然的你 2023-07-13 16:56:33
我有一個包含用戶信息(包括密碼字段)的類。當用戶登錄時,它將返回類中的所有內容,包括密碼。除了密碼或僅保留在數據庫中的任何重要數據之外,如何不返回課堂上的所有內容。我嘗試使用地圖,這也返回我想要的方式,但我希望是否有比地圖更簡單或更快的東西。很少有答案建議使用 JsonIgnore 和瞬態。如果我使用這兩種方法,我將無法登錄。因為我需要找回密碼才能登錄。我的 POJO 類@Entitypublic class Users {@Column(name = "id")@GeneratedValue(strategy = GenerationType.AUTO)private long id;@Column(name = "firstname")private String firstName;@Column(name = "lastname")private String lastName;@Id@Column(name = "username")private String username;@Column(name = "email")private String email;@Column(name = "role")private String role;@Column(name = "password")private String password;回購類  public interface UsersRepository extends CrudRepository<Users,   String> {public Users findByUsername(String username);}這是休息 API@GetMapping("/users/{username}")public Map<String, Object> usersCheck(@PathVariable String  username) {    Map<String, Object> addUser = new HashMap<>();    Users user = userRepo.findByUsername(username);    addUser.put("email", user.getEmail());    addUser.put("firstName",user.getFirstName()); " "    return addUser;}還有比 Map 更好的方法嗎?任何建議都會有所幫助。
查看完整描述

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 處理指令“污染”實體。


查看完整回答
反對 回復 2023-07-13
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

實際上,jpa查詢中有一種方法只返回特定字段,這樣您就可以在獲取結果時直接使用。

但如果您不想干擾 findByUsername 方法,只需創建 User 類的對象并僅設置所需的字段即可。

您目前使用的方法也是可行的解決方案。


查看完整回答
反對 回復 2023-07-13
?
慕后森

TA貢獻1802條經驗 獲得超5個贊

如果您想從響應中排除密碼,請使用 注釋密碼字段@JsonIgnore。

如果您想排除實體中的多個字段User,請創建一個UserDto類并在該類中添加所需的字段UserDto。

用于ModelMapper將用戶實體映射到UserDto類。最后返回這個 UserDto 類作為響應對象。

例子:

  User user = new User();
    UserDto userDto = new ModelMapper.map(user, UserDto.class);

這將僅包括 UserDto 中的字段


查看完整回答
反對 回復 2023-07-13
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

除了已經提到的回復之外,還有其他一些方法,例如 JsonIgnoreProperties、JsonIgnoreType、JsonFilter。我更喜歡 JsonIgnore 來抑制輸出中的字段。

此外,您始終可以創建一個單獨的 POJO 類來返回所需的值。


查看完整回答
反對 回復 2023-07-13
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

因此,有兩種不同的方法可以解決這個問題。

  1. transient在您的實體類中創建密碼字段。

這樣,當您獲取 Users 對象時,密碼字段將為空。

缺點:使密碼成為臨時密碼將導致您無法通過應用程序中任何位置的實體獲取密碼。

  1. 在密碼字段上使用@JsonIgnore(來自杰克遜庫)。這樣,當您返回 Users 對象的對象時,密碼字段將被忽略。

缺點:這再次意味著,如果您想在整個應用程序中將密碼字段作為輸入或返回密碼字段,您將無法這樣做。另外,不建議您返回 POJO 類的對象作為響應。

因此,您可以選擇任何一種方法,同時記住每種方法的缺點。


查看完整回答
反對 回復 2023-07-13
?
呼如林

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)。)


查看完整回答
反對 回復 2023-07-13
  • 6 回答
  • 0 關注
  • 245 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號