boke练习: category类的编辑修改,总是提示:该分类名称已经存在
本利采用的dao是: jpaRepository方式
先看原始代码:
category的实体类
@Entity public class Category implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @NotEmpty(message="分类名称不能为空") @Size(min=2, max=50) @Column(nullable=false, length=50) //映射为字段 private String name; //用户信息,user_id @OneToOne(cascade=CascadeType.DETACH, fetch=FetchType.LAZY) //// 懒加载 @JoinColumn(name="user_id") private User user; public Category() { } public Category( User user, String name) { this.name = name; this.user = user; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
category的实现
@Service public class CategoryServiceImpl implements CategoryService { @Autowired private CategoryRepository categoryRepository; private Logger logger = Logger.getLogger(CategoryServiceImpl.class); @Transactional @Override public Category saveCategory(Category category) { // TODO Auto-generated method stub List<Category> list = categoryRepository.findByUserAndName(category.getUser(), category.getName()); if(list !=null && list.size() > 0) { for(Category cate: list) { logger.info(cate.toString() + " | title:" + category.getName()); } throw new IllegalArgumentException("该分类名称已经存在:"+category.getName() + ":size:"+list.size()); } return categoryRepository.save(category); } @Transactional @Override public void removeCategory(Long id) { // TODO Auto-generated method stub categoryRepository.delete(id); } @Override public Category getCategory(Long id) { // TODO Auto-generated method stub return categoryRepository.findOne(id); } @Override public List<Category> listCategory(User user) { // TODO Auto-generated method stub return categoryRepository.findByUser(user); } }
这一段,有一句是用来判断:当前用户下是否有重复的分类名称:
public Category saveCategory(Category category) { // TODO Auto-generated method stub List<Category> list = categoryRepository.findByUserAndName(category.getUser(), category.getName()); if(list !=null && list.size() > 0) { for(Category cate: list) { logger.info(cate.toString() + " | title:" + category.getName()); } throw new IllegalArgumentException("该分类名称已经存在:"+category.getName() + ":size:"+list.size()); } return categoryRepository.save(category); }
也就是这一句:
List<Category> list = categoryRepository.findByUserAndName(category.getUser(), category.getName());
在页面编辑分类的时候,随便修改一个分类名称:如,笑话2改成笑话,总是提示分类名已经存在.。
后来经过研究发现,在修改(或添加)分类时,传递的是Category的数据,也就是在CategoryController类中接收的是Category的数据,导致在编辑数据的时候总是提示分类名已经存在(不知道是不是jpaRepository的bug)
html
layui.jquery.ajax({ type: 'POST', url: "/category/${cateModel.category.user.username}/post", beforeSend: function(request) { request.setRequestHeader(data.field._csrf_header, data.field._csrf); }, contentType:"application/json", data: JSON.stringify({ id: data.field.category_id, name: data.field.name }) /*JSON.stringify({ username: data.field.userName, category: {id: data.field.category_id, name: data.field.name} })*/ , success: function(data){ if(data.code==0) { layer.msg("操作成功!"); location.href='/category/${cateModel.user.username}'; }else{ layer.msg("操作失败!"); } },error:function() { layer.msg("操作失败!"); } }); return false; });
controller
@PostMapping("/{username}/post") public ResponseEntity<Response> saveCategory( @RequestBody Category category, @PathVariable("username") String username ) { User user = (User) userDetailsService.loadUserByUsername(username); try { if(category.getId() != null) { ........ }else{ category.setUser(user); categoryService.saveCategory(category); } } catch (Exception e) { // TODO: handle exception return ResponseEntity.ok().body(new Response(1, 0,"fail", null)); } //return ResponseEntity.ok().body(new Response(1, 0, categoryVO.toString(), null)); return ResponseEntity.ok().body(new Response(0, 0, "success", null)); }
后来经过修改,发现有2中解决方案,
1是修改 controller的处理方法,
@PostMapping("/{username}/post") //@PreAuthorize("authentication.name.equals(#categoryVO.username)") @PreAuthorize("authentication.name.equals(#username)") public ResponseEntity<Response> saveCategory( //@RequestBody CategoryVO categoryVO @RequestBody Category category, @PathVariable("username") String username ) { //String username = categoryVO.getUsername(); //Category category = categoryVO.getCategory(); User user = (User) userDetailsService.loadUserByUsername(username); try { category.setUser(user); categoryService.saveCategory(category); } catch (Exception e) { // TODO: handle exception return ResponseEntity.ok().body(new Response(1, 0,"fail", null)); } //return ResponseEntity.ok().body(new Response(1, 0, categoryVO.toString(), null)); return ResponseEntity.ok().body(new Response(0, 0, "success", null)); }
2是,新增CategoryVo类来接收提交过来的数据
html
layui.jquery.ajax({ type: 'POST', url: "/category/${cateModel.category.user.username}/post", beforeSend: function(request) { request.setRequestHeader(data.field._csrf_header, data.field._csrf); }, contentType:"application/json", data: JSON.stringify({ username: data.field.userName, category: {id: data.field.category_id, name: data.field.name} }) , success: function(data){ if(data.code==0) { layer.msg("操作成功!"); location.href='/category/${cateModel.user.username}'; }else{ layer.msg("操作失败!"); } },error:function() { layer.msg("操作失败!"); } }); return false; });
categoryVo
public class CategoryVO implements Serializable { /** * */ private static final long serialVersionUID = 1L; private String username; private Category category; public CategoryVO() { } public CategoryVO(String username, Category category) { this.username = username; this.category = category; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } @Override public String toString() { return "CategoryVO{" + "username='" + username + '\'' + ", category=" + category + '}'; } }
controller
@PostMapping("/{username}/post") @PreAuthorize("authentication.name.equals(#categoryVO.username)") public ResponseEntity<Response> saveCategory( @RequestBody CategoryVO categoryVO ) { String username = categoryVO.getUsername(); Category category = categoryVO.getCategory(); User user = (User) userDetailsService.loadUserByUsername(username); try { category.setUser(user); categoryService.saveCategory(category); } catch (Exception e) { // TODO: handle exception return ResponseEntity.ok().body(new Response(1, 0,"fail", null)); } //return ResponseEntity.ok().body(new Response(1, 0, categoryVO.toString(), null)); return ResponseEntity.ok().body(new Response(0, 0, "success", null)); }