4

Spring Dataの監査機能を使用しており、次のようなクラスがあります。

@実在物
@監査済み
@EntityListeners(AuditingEntityListener.class)
@Table(name="学生")
公開クラス 生徒 {
    @ID
    @GeneratedValue (戦略 = GenerationType.AUTO)
    プライベート ロング ID。

    @によって作成された
    プライベート文字列の作成者;

    @作成日
    プライベート作成日;

    @LastModifiedBy
    プライベート文字列 lastModifiedBy;

    @LastModifiedDate
    プライベート日付 lastModifiedDate;
...

これで、ドメイン オブジェクトを更新すると、createdBy、createdDate、lastModifiedBy、lastModifiedDate のすべてが正しい値を取得していることがわかるので、監査を適切に構成できたと思います。

ただし、私の問題は、オブジェクトを更新すると、createdBy と createdDate の値が失われることです。そのため、最初にオブジェクトを作成したときは 4 つの値がすべてありますが、更新すると createdBy と createdDate が null になります。また、Hibernate envers を使用してドメイン オブジェクトの履歴を保持しています。

なぜ私がこの振る舞いをするのか知っていますか? ドメイン オブジェクトを更新すると、createdBy と createdDate が空になるのはなぜですか?

更新: @m-deinum の質問に答えるには: はい、Spring Data JPA は正しく構成されています - 他のすべては正常に動作します - 構成を投稿したくありません。

私のAuditorAwareImplはこれです

@成分
public class AuditorAwareImpl は AuditorAware を実装します {
    ロガー logger = Logger.getLogger(AuditorAwareImpl.class);

    @Autowired
    ProfileService プロファイル サービス;

    @オーバーライド
    public String getCurrentAuditor() {
        profileService.getMyUsername(); を返します。
    }
}

最後に、更新コントローラーの実装を次に示します。

    @Autowired  
    プライベート StudentFormValidator バリデータ。
    @Autowired
    プライベート StudentRepository StudentRep;

@RequestMapping(value="/edit/{id}", method=RequestMethod.POST)  
public String updateFromForm(
         @PathVariable("id")長いID、
         @Valid Student 生徒、BindingResult 結果、
         最終的な RedirectAttributes redirectAttributes) {  

     学生 s = studentRep.secureFind(id);
     if(学生 == null || s == null) {
         新しい ResourceNotFoundException() をスローします。
     }
     validator.validate(学生、結果);
     if (result.hasErrors()) {  
         「学生/フォーム」を返します。
     }
     Student.setId(id);
     Student.setSchool(profileService.getMySchool());
     redirectAttributes.addFlashAttribute("メッセージ", "メッセージ");
     studentRep.save(学生);
     return "redirect:/students/list";  
}  

更新 2 : 新しいバージョンをご覧ください

@RequestMapping(value="/edit/{id}", method=RequestMethod.GET)  
     public ModelAndView editForm(@PathVariable("id")Long id) {  
         ModelAndView mav = new ModelAndView("学生/フォーム");  
         学生学生 = studentRep.secureFind(id);
         if(学生 == null) {
             新しい ResourceNotFoundException() をスローします。
         }
         mav.getModelMap().addAttribute(学生);
         mav.getModelMap().addAttribute("性別", GenderEnum.values());
         mav.getModelMap().addAttribute("studentTypes", StudEnum.values());
         mav を返します。  
     }  

     @RequestMapping(value="/edit/{id}", method=RequestMethod.POST)  
     public String updateFromForm(
             @PathVariable("id")長いID、
             @Valid @ModelAttribute Student 生徒、BindingResult 結果、
             最終的な RedirectAttributes redirectAttributes、SessionStatus ステータス) {  

         学生 s = studentRep.secureFind(id);
         if(学生 == null || s == null) {
             新しい ResourceNotFoundException() をスローします。
         }

         if (result.hasErrors()) {  
             「学生/フォーム」を返します。
         }
         //student.setId(id);
         Student.setSchool(profileService.getMySchool());
         studentRep.save(学生);
         redirectAttributes.addFlashAttribute("message", "Επιτυχής προσθήκη!");
         status.setComplete();
         return "redirect:/students/list";  
     }  

This still leaves empty the createdBy and createdDate fields when I do an update :(

Also it does not get the School value (which is not contained in my form because it is related to the user currently editing) so I need to get it again from the SecurityContext... Have I done anything wrong ?

Update 3: For reference and to not miss it in the comments: The main problem was that I needed to include the @SessionAttributes annotation to my controller.

4

3 に答える 3