【问题标题】:@GetMapping doesn't display CreditCards under username. @PostMapping doesn't create a new card for user, it only updates it@GetMapping 不会在用户名下显示 CreditCards。 @PostMapping 不会为用户创建新卡,它只会更新它
【发布时间】:2020-07-28 06:27:56
【问题描述】:

我的用户类如下所示:

@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 的信用卡?我怀疑信用卡的主键与用户的主键相同。在这里使用可选的也很糟糕(只需使用maporElseThrow 代替ifs,基本上这是可选的错误用法)。
  • 您为什么要问与昨天在stackoverflow.com/questions/63110054/… 相同的问题。上面的评论和那里的 cmets 清楚地解释了这个问题。
  • 我投票结束这个问题,因为用户已经在这里提出了这个问题:stackoverflow.com/questions/63110054/…
  • 可选地使用了 User 类的 Job。此外,程序的重点是获取单个用户的卡列表,为什么使用 OneToMany 和 ManyToOne,必须有一个列在用户和信用卡之间共享相同的值才能找到那些属于特定用户。

标签: spring spring-boot spring-data-jpa one-to-many many-to-one


【解决方案1】:
  1. 您正在尝试使用您的用户 ID 获得信用卡

    return cardsRepository.findById(userRepository.findByUsername(username).get().getUserID());
    

    相反,您可以按用户搜索您的信用卡。为此,您应该在信用卡存储库接口中创建一个方法。

    List<CreditCard> findByUser(User user);
    

    然后从你的控制器调用这个方法

    return cardsRepository.findByUser(userRepository.findByUsername(username).get())
    
  1. 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 我想你可以自己处理。

【讨论】:

【解决方案2】:

更新:我必须为每张信用卡创建一个 ID,因为如果在创建每张新信用卡时分配了相同的 ID,那么程序会将其视为我是尝试更新的同一个人。

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 2021-11-13
    • 2020-11-16
    • 1970-01-01
    • 2020-07-09
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多