我正在使用spring数据的审计能力,并且有一个类似于这样的类:
@Entity @Audited @EntityListeners(AuditingEntityListener.class) @Table(name="Student") public class Student { @Id @GeneratedValue (strategy = GenerationType.AUTO) private Long id; @CreatedBy private String createdBy; @CreatedDate private Date createdDate; @LastModifiedBy private String lastModifiedBy; @LastModifiedDate private Date lastModifiedDate; ...
现在,我相信我已经很好地配置了审计,因为我可以看到在更新域对象时,createdBy、createdDate、lastModifiedBy和lastModifiedDate都得到了正确的值。
但是,我的问题是,当我更新一个对象时,我会丢失createdBy和createddate的值。所以,当我第一次创建对象时,我有所有四个值,但是当我更新它时,createdBy和createdDate都是空的!我还使用Hibernate Enver来保持域对象的历史记录。
你知道我为什么会有这种行为吗?为什么在我更新域对象时createdBy和createdDate为空?
更新:回答@m-deinum的问题:是的,Spring Data JPA配置正确--其他一切都正常--我真的不想贴出配置,因为当你看到它需要很大的空间。
我的AuditorAwareImpl是这样的
@Component public class AuditorAwareImpl implements AuditorAware { Logger logger = Logger.getLogger(AuditorAwareImpl.class); @Autowired ProfileService profileService; @Override public String getCurrentAuditor() { return profileService.getMyUsername(); } }
最后,这里是我的更新控制器实现:
@Autowired private StudentFormValidator validator; @Autowired private StudentRepository studentRep; @RequestMapping(value="/edit/{id}", method=RequestMethod.POST) public String updateFromForm( @PathVariable("id")Long id, @Valid Student student, BindingResult result, final RedirectAttributes redirectAttributes) { Student s = studentRep.secureFind(id); if(student == null || s == null) { throw new ResourceNotFoundException(); } validator.validate(student, result); if (result.hasErrors()) { return "students/form"; } student.setId(id); student.setSchool(profileService.getMySchool()); redirectAttributes.addFlashAttribute("message", "Επιτυχής προσθήκη!"); studentRep.save(student); return "redirect:/students/list"; }
更新2:请看一看更新版本
@RequestMapping(value="/edit/{id}", method=RequestMethod.GET) public ModelAndView editForm(@PathVariable("id")Long id) { ModelAndView mav = new ModelAndView("students/form"); Student student = studentRep.secureFind(id); if(student == null) { throw new ResourceNotFoundException(); } mav.getModelMap().addAttribute(student); mav.getModelMap().addAttribute("genders", GenderEnum.values()); mav.getModelMap().addAttribute("studentTypes", StudEnum.values()); return mav; } @RequestMapping(value="/edit/{id}", method=RequestMethod.POST) public String updateFromForm( @PathVariable("id")Long id, @Valid @ModelAttribute Student student, BindingResult result, final RedirectAttributes redirectAttributes, SessionStatus status) { Student s = studentRep.secureFind(id); if(student == null || s == null) { throw new ResourceNotFoundException(); } if (result.hasErrors()) { return "students/form"; } //student.setId(id); student.setSchool(profileService.getMySchool()); studentRep.save(student); redirectAttributes.addFlashAttribute("message", "Επιτυχής προσθήκη!"); status.setComplete(); return "redirect:/students/list"; }
当我执行更新时,这仍然将createdBy和createdDate字段留为空:(
此外,它没有获得学校值(它不包含在我的表单中,因为它与当前编辑的用户相关),所以我需要从SecurityContext重新获得它...我做错什么了吗?
更新3:供参考并且不要在评论中错过它:主要问题是我需要将@SessionAttributes注释包含到我的控制器中。
使用@column注释的updatable属性,如下所示。
@Column(name = "created_date", updatable = false)
private Date createdDate;
这将在更新操作时保留创建的日期。
您的(@)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 Data的审计功能,并且具有与此类似的类: 现在,我相信我已经配置好了审核功能,因为当我更新域对象时,可以看到createdBy,createdDate,lastModifiedBy和lastModifiedDate都获得了正确的值。 但是,我的问题是,当我更新对象时,我丢失了createdBy和createdDate的值。因此,当我第一次创建该对象时,我具有所
接口说明 审核用户的注册申请 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/user/1.0.0/check 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 guid string form 是 用户ID status int form 是 用户状态[0:未审核;1:已审核] 响应字段说明 无 响应
小程序审核规范 为保护用户权益及京东小程序平台安全,并方便小程序开发者对平台审核规则进行了解,京东制订京东小程序审核规范(以下简称“本规范”)。除本规范外,服务商还应遵守《京东小程序平台服务条款》(以下简称“平台服务条款”)、小程序运营规范及京东修订或公布的相关协议、规则与规范。 一、小程序基本信息审核 1.京东小程序的基本信息,其中包括小程序名称、介绍、图标等均不可: (1) 侵犯他人的著作权、
审核发布流程 第一步:上传代码包 开发完成后,开发者在开发管理中通过手动点击“上传代码包”的方式提交开发版本。京东小程序允许多次上传代码包,重新上传后将覆盖之前的版本。 在提交审核之前可以将您的京东小程序设置为体验版本,让部分用户先体验小程序。 第二步:提交审核 代码包上传成功后,并且小程序功能研发和测试完毕,通过点击“提交审核”,将当前的开发版本提交审核。可以在审核版本中看到,当状态为“审核中”
工单审核 实时刷新开关默认打开,如需删除记录请先关闭该开关。 如定时工单的时间小于当前时间,执行该工单将会立即执行(请确保Yearning所在环境时区与使用者时区一致,否则会导致定时执行异常!) 目前仅支持延时工单中止,其他工单执行后无法中止! 执行成功的工单可点击执行信息按钮后查看回滚语句 查询审核 点击全部中止按钮将会中止所有用户的查询权限 如没有在设置页面开启查询审核开关,则默认用户查询申请