実現したいこと
ログイン中のユーザー情報を@ManyToOneが付いたフィールドにセットしたいです。
具体的には、現在単語を記録できるアプリを作成しているのですが、どのユーザーがどの単語を記録したのか区別するために、単語情報を保持するWordEntityというエンティティクラス内のuserというフィールドに@ManyToOneや@JoinColumnを使用して、テーブルの結合を行いたいのです。
発生している問題・分からないこと
調べたところSpringSecurityのSecurityContextHolderというメソッドがよく使用されているそうなので使用したのですが、恐らく型が合わずにエラーが返されてしまいます。一応キャストしているのですが、ClassCastExceptionがスローされてしまいます。この解決方法を探しています。
また、そもそもこの手法は一般的に採用される方法なのでしょうか?独学かつ初心者であるため、判断をするのが難しく投稿させていただきました。もしそうでないのであればよく採用されている方法も教えていただけると幸いです。
加えて、今回の問題の解決方法や、それに対する役立つ考え方が載っている教材等がもしあれば、そちらも教えていただけるとなお嬉しいです。
該当のソースコード
Java
1package com.example.demo.entity;2 3import org.springframework.stereotype.Component;4 5import jakarta.persistence.Entity;6import jakarta.persistence.GeneratedValue;7import jakarta.persistence.GenerationType;8import jakarta.persistence.Id;9import jakarta.persistence.JoinColumn;10import jakarta.persistence.ManyToOne;11import jakarta.persistence.Table;12import lombok.AllArgsConstructor;13import lombok.Data;14import lombok.NoArgsConstructor;15 16@Entity17@Component18@Table(name = "words")19@Data20@AllArgsConstructor21@NoArgsConstructor22public class WordEntity {23 24 @Id25 @GeneratedValue(strategy = GenerationType.IDENTITY)26 private Long id;27 28 private String english;29 30 private String japanese;31 32 @ManyToOne33 @JoinColumn(name = "login_id")34 private UserInfo user;35}36
Java
1package com.example.demo.entity;2 3import java.time.LocalDateTime;4 5import jakarta.persistence.Column;6import jakarta.persistence.Entity;7import jakarta.persistence.Id;8import jakarta.persistence.Table;9import lombok.AllArgsConstructor;10import lombok.Data;11import lombok.NoArgsConstructor;12 13@Entity14@Table(name = "user_info")15@Data16@AllArgsConstructor17@NoArgsConstructor18public class UserInfo {19 20 @Id21 @Column(name = "login_id")22 private String loginId;23 24 private String password;25}
Java
1package com.example.demo.service;2 3import org.springframework.security.core.context.SecurityContextHolder;4import org.springframework.stereotype.Service;5 6import com.example.demo.entity.UserInfo;7import com.example.demo.entity.WordEntity;8import com.example.demo.form.AddForm;9import com.example.demo.repository.WordRepository;10 11import lombok.RequiredArgsConstructor;12 13@RequiredArgsConstructor14@Service15public class AddService {16 17 private final WordRepository wordRepository;18 19 private final WordEntity wordEntity;20 21 public WordEntity addWord(AddForm form) {22 Object user = SecurityContextHolder.getContext().getAuthentication().getPrincipal();23 24 wordEntity.setEnglish(form.getEnglish());25 wordEntity.setJapanese(form.getJapanese());26 wordEntity.setUser((UserInfo) user);27 28 return wordRepository.save(wordEntity);29 }30}
試したこと・調べたこと
上記の詳細・結果
teratailで「SecurityContextHolder」と検索したがヒットしない。
補足
特になし

0 コメント