spring - @GetMapping 不会在用户名下显示 CreditCards。@PostMapping 不会为用户创建新卡,它只会更新它
问题描述
我的用户类如下所示:
@Entity
@Table(name = "Users")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "userID")
private Integer userID;
@Column(name = "username",nullable = false, unique = true)
private String username;
@Column(name = "password")
private String password;
@Column(name = "name")
private String name;
@Column(name = "address")
private String address;
@Column(name = "email")
private String email;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<CreditCard> creditCard;
//Constructor, Getters and Setters
CreditCard 类看起来:
@Entity
@Table(name = "CreditCards")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class CreditCard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cardID", nullable = false)
private Integer cardID;
@Column(name = "cardName")
private String cardName;
@Column(name = "cardNumber")
private BigInteger cardNumber;
@Column(name = "expirationDate")
private Integer expirationDate;
@Column(name = "securityCode")
private Integer securityCode;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "user_id", nullable = false)
@JsonIgnore
private User user;
//Constructor, Getters and Setters
信用卡资源:
@RestController
@RequestMapping("/geektext/users")
class CreditCardResource {
@Autowired
CreditCardRepository cardsRepository;
@Autowired
UserRepository userRepository;
//Displays CreditCard By Username Search
@GetMapping("/{username}/cards")
public Optional<CreditCard> getCardsByUsername(@PathVariable String username) throws NotFoundException {
if (!userRepository.findByUsername(username).isPresent()){
throw new NotFoundException("User '" + username + "' not found");
}
return cardsRepository.findById(userRepository.findByUsername(username).get().getUserID());
}
//Creates New Card for User
@PostMapping("/{userID}/cards")
public CreditCard loadCard(@PathVariable String userID, @RequestBody CreditCard creditCard) throws NotFoundException {
return userRepository.findByUsername(userID).map(user -> {creditCard.setUser(user);
return cardsRepository.save(creditCard);
}).orElseThrow(() -> new NotFoundException("User '" + userID + "' not found"));
}
}
还有一个 UserResource.java , UserRepository (Interface) 和 CreditCardRepository) 但这些不会影响我遇到的问题。请我如何修复获取用户在 url 上传递用户名的卡片列表。用户如何创建新的/多于一张信用卡而不是更新他拥有的信用卡。
解决方案
您正在尝试使用您的用户 ID 获得信用卡
return cardsRepository.findById(userRepository.findByUsername(username).get().getUserID());
相反,您可以按用户搜索您的信用卡。为此,您应该在信用卡存储库接口中创建一个方法。
List<CreditCard> findByUser(User user);
然后从您的控制器调用此方法
return cardsRepository.findByUser(userRepository.findByUsername(username).get())
post方法也有类似的问题。您试图通过用户名获取用户,但传递用户 ID。此外,您将用户设置为您的新信用卡,但您没有向您的用户添加新信用卡。(并将 User 类中的 credit-cards 变量的名称更改为
creditCards
)return userRepository.findByUsername(userID).map(user -> {creditCard.setUser(user); return cardsRepository.save(creditCard); }).orElseThrow(() -> new NotFoundException("User '" + userID + "' not found"));
这会好很多。如果我写错了,请自己测试并更改一些内容
User user = userRepository.findById(userID); user.getCreditCards().add(creditCard); creditCard.setUser(user); userRepository.save(user);
NotFoundException 我想你可以自己处理。
推荐阅读
- sql - 使用 SQL for Postgres 的 ETL
- node.js - 使用 Webpack 4 和 Babel 7 的 React-Loadable SSR
- powershell - AD中大组的快速查询
- kubernetes - 为什么我需要将 ETCDCTL_API=3 放在 etcdctl 前面才能使 etcdctl 快照保存工作?
- c - 创建链表头的问题
- amazon-redshift - 在 reshift 上实现 deepcopy
- ios - IOS Swift如何突出显示选定的图像
- php - laravel 超过日期和 from_dates 和 to_date 之间如何写逻辑
- javascript - TypeError: undefined is not an object (评估 this.getActiveTab().barColor)
- mysql - SQL 获取每日注册用户总数