当前位置: 首页 > 面试题库 >

Spring JPA审核为空已创建

叶晋
2023-03-14
问题内容

我正在使用Spring Data的审计功能,并且具有与此类似的类:

@实体
@审核
@EntityListeners(AuditingEntityListener.class)
@Table(name =“学生”)
公共班学生{
    @ID
    @GeneratedValue(策略= GenerationType.AUTO)
    私人Long ID;

    @由...制作
    私人字串createdBy;

    @创建日期
    私人Date createdDate;

    @LastModifiedBy
    私有字符串lastModifiedBy;

    @LastModifiedDate
    私有日期lastModifiedDate;
...

现在,我相信我已经配置好了审核功能,因为当我更新域对象时,可以看到createdBy,createdDate,lastModifiedBy和lastModifiedDate都获得了正确的值。

但是,我的问题是,当我更新对象时,我丢失了createdBy和createdDate的值。因此,当我第一次创建该对象时,我具有所有四个值,但是当我对其进行更新时,createdBy和createdDate将被无效!我还使用Hibernate
envers来保留域对象的历史记录。

您知道我为什么会出现这种行为吗?为什么在更新域对象时createdBy和createdDate为空?

更新 :回答@ m-deinum的问题:是的,Spring数据JPA配置正确-其他一切正常-我真的不希望发布该配置,因为当您了解它时会需要很多空间。

我的AuditorAwareImpl是这个

@零件
公共类AuditorAwareImpl实现了AuditorAware {
    记录器logger = Logger.getLogger(AuditorAwareImpl.class);

    @Autowired
    ProfileService profileService;

    @Override
    公共字符串getCurrentAuditor(){
        返回profileService.getMyUsername();
    }
}

最后,这是我的更新控制器实现:

    @Autowired  
    私人StudentFormValidator验证器;
    @Autowired
    私人StudentRepository学生代表;

@RequestMapping(value =“ / edit / {id}”,method = RequestMethod.POST)  
公共字符串updateFromForm(
         @PathVariable(“ id”)长id,
         @Valid Student学生,BindingResult结果,
         最终RedirectAttributes redirectAttributes){

     学生s = studentRep.secureFind(id); 
     if(学生== null || s == null){
         抛出新的ResourceNotFoundException();
     }
     validator.validate(学生,结果);
     如果(result.hasErrors()){  
         返回“学生/表格”;
     } 
     student.setId(id);
     student.setSchool(profileService.getMySchool());
     redirectAttributes.addFlashAttribute(“ message”,“Επιτυχήςπροσθήκη!”);
     studentRep.save(学生);
     返回“重定向:/学生/列表”;  
}

更新2 :请查看较新的版本

@RequestMapping(value =“ / edit / {id}”,method = RequestMethod.GET)  
     公共ModelAndView editForm(@PathVariable(“ id”)Long id){  
         ModelAndView mav =新的ModelAndView(“ students / form”);  
         学生人数= studentRep.secureFind(id); 
         if(student == null){
             抛出新的ResourceNotFoundException();
         }
         mav.getModelMap()。addAttribute(student);
         mav.getModelMap()。addAttribute(“ genders”,GenderEnum.values());
         mav.getModelMap()。addAttribute(“ studentTypes”,StudEnum.values());
         返回mav;  
     }

     @RequestMapping(value =“ / edit / {id}”,method = RequestMethod.POST)  
     公共字符串updateFromForm(
             @PathVariable(“ id”)长id,
             @Valid @ModelAttribute学生,BindingResult结果,
             最终RedirectAttributes redirectAttributes,SessionStatus状态){

         学生s = studentRep.secureFind(id); 
         if(学生== null || s == null){
             抛出新的ResourceNotFoundException();
         }

         如果(result.hasErrors()){  
             返回“学生/表格”;
         } 
         //student.setId(id);
         student.setSchool(profileService.getMySchool());
         studentRep.save(学生);
         redirectAttributes.addFlashAttribute(“ message”,“Επιτυχήςπροσθήκη!”);
         status.setComplete();
         返回“重定向:/学生/列表”;  
     }

当我进行更新时,这 仍然 留空createdBy和createdDate字段:(

而且它没有获得School值(该值不包含在我的表单中,因为它与当前正在编辑的用户有关),因此我需要再次从SecurityContext中获取它。我做错了什么吗?

更新3 :仅供参考,不要在注释中遗漏:主要问题是我需要在控制器中包含@SessionAttributes批注。


问题答案:

您的(@)Controller类中的方法效率不高。您不想(手动)检索对象并将所有字段,关系等复制到该对象上。除了复杂的对象,您早晚或会遇到麻烦。

您想要的是第一种方法(用于显示表单的GET)来检索用户并将其存储在会话中@SessionAttributes。接下来,您需要一个带@InitBinder注释的方法将验证器设置为,WebDataBinder以便spring进行验证。这将使您的updateFromForm方法更干净。

@Controller
@RequestMapping("/edit/{id}")
@SessionAttributes("student")
public EditStudentController

    @Autowired  
    private StudentFormValidator validator;

    @Autowired
    private StudentRepository studentRep;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.setValidator(validator);
    }

    @RequestMapping(method=RequestMethod.GET)
    public String showUpdateForm(Model model) {
        model.addObject("student", studentRep.secureFind(id));
        return "students/form";
    }

    @RequestMapping(method=RequestMethod.POST)
    public String public String updateFromForm(@Valid @ModelAttribute Student student, BindingResult result, RedirectAttributes redirectAttributes, SessionStatus status)   {  
        // Optionally you could check the ids if they are the same.
        if (result.hasErrors()) {  
            return "students/form";
        } 
        redirectAttributes.addFlashAttribute("message", "?p?t???? p??s????!");
        studentRep.save(student);
        status.setComplete(); // Will remove the student from the session
        return "redirect:/students/list";  
    }
}

您将需要将SessionStatus属性添加到方法中并标记处理完成,以便Spring可以从会话中清理模型

这样,您就不必在对象等周围复制。Spring会进行所有的升举,并且所有字段/关系都将正确设置。



 类似资料:
  • 我正在使用spring数据的审计能力,并且有一个类似于这样的类: 现在,我相信我已经很好地配置了审计,因为我可以看到在更新域对象时,createdBy、createdDate、lastModifiedBy和lastModifiedDate都得到了正确的值。 但是,我的问题是,当我更新一个对象时,我会丢失createdBy和createddate的值。所以,当我第一次创建对象时,我有所有四个值,但是

  • 我在试图让被审计的实体引用未被审计的实体时遇到问题。在我们的应用程序中,某些实体在没有使用hibernate的情况下被引导,这些实体是我们的元模型,不需要被审计。 如果我执行代码: 一切都很顺利,但是如果我试图获得B的版本,就会出现错误: 组织.Hibernate.对象不发现例外:不存在具有给定标识符的行 [元foo] Envers通过对metafoo实体的惰性引用成功地查找了B实体。然而,当尝试

  • 接口说明 审核用户的注册申请 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/user/1.0.0/check 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 guid string form 是 用户ID status int form 是 用户状态[0:未审核;1:已审核] 响应字段说明 无 响应

  • 小程序审核规范 为保护用户权益及京东小程序平台安全,并方便小程序开发者对平台审核规则进行了解,京东制订京东小程序审核规范(以下简称“本规范”)。除本规范外,服务商还应遵守《京东小程序平台服务条款》(以下简称“平台服务条款”)、小程序运营规范及京东修订或公布的相关协议、规则与规范。 一、小程序基本信息审核 1.京东小程序的基本信息,其中包括小程序名称、介绍、图标等均不可: (1) 侵犯他人的著作权、

  • 审核发布流程 第一步:上传代码包 开发完成后,开发者在开发管理中通过手动点击“上传代码包”的方式提交开发版本。京东小程序允许多次上传代码包,重新上传后将覆盖之前的版本。 在提交审核之前可以将您的京东小程序设置为体验版本,让部分用户先体验小程序。 第二步:提交审核 代码包上传成功后,并且小程序功能研发和测试完毕,通过点击“提交审核”,将当前的开发版本提交审核。可以在审核版本中看到,当状态为“审核中”