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