首页 > 技术文章 > boke练习: category类的编辑修改,总是提示:该分类名称已经存在

achengmu 2018-10-29 10:29 原文

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));
		
	}

  

 

推荐阅读