boke练习: category类的编辑修改,总是提示:该分类名称已经存在
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));
	}
boke练习: category类的编辑修改,总是提示:该分类名称已经存在的更多相关文章
- Object-C中Category类体验
		Object-C中Category类体验 Object-C开发的时候有的时候会用到Category类,类似于Java和C#中扩展类,就是如果你觉得如果你觉得常用的方法在String中没有,可以根据业务 ... 
- Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?
		Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么? 答:Object-c的类不可以多重继承,可以实现多个接口(协议),Cate ... 
- element UI Cascader 级联选择器 编辑 修改 数组 路径 问题(转载)
		来源:https://segmentfault.com/a/1190000014827485 element UI的Cascader级联选择器编辑时 vue.js element-ui 2 eleme ... 
- Win10系统修改主机名、用户名称和密码、以及C盘中的用户文件夹名
		写在前面 近期重新安装了Ubuntu16.04系统,同时也修改了Windows10系统的用户名.密码,还有C盘用户文件夹名称.对于Linux和windows系统来说,修改名称基本都是三部分,主机名.用 ... 
- Eclipse编辑XML自动提示(zz)
		Eclipse编辑XML自动提示 博客分类: j2se XMLEclipseiBATISSpringSQL IED Eclipse Java EE IDE for Web Developers: D ... 
- 类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,
		编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 ... 
- 修改placeholder提示内容的颜色以及文本框输入文字内容的颜色
		一般表单文本框提示信息:placeholder=" ",默认颜色是灰色的,输入文本信息也是默认为黑色的,如图所示: 修改placeholder提示内容的颜色关键代码及实现: 实现输 ... 
- 去掉eclipse上编辑时的提示
		用eclipse时,鼠标移到类上时会给出提示,如下图: 
- 在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了?
		在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了? 在删除成功后,加上这句话就可以了:$("#dg").datagrid ... 
随机推荐
- 使用Jenkins构建、部署spring boot项目
			一.环境搭建 本次实验的环境为Ubuntu 16.04,Jenkins 2.8.3 1.安装ssh sudo apt-get update # 更新软件源 sudo apt-get install o ... 
- Python3 tkinter基础 Canvas background 创建白色的画布 create_line width 画宽的线
			Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ... 
- vue学习【第三篇】:vue之node.js的简单介绍
			什么是node.js 它是可以运行JavaScript的服务平台,可以吧它当做一门后端程序,只是它的开发语言是JavaScript 安装node.js node.js的特性 - 非阻塞IO模型 - 时 ... 
- CentOS Yum 源搭建
			创建yum源服务,主要用到了两个软件createrepo和httpd.前者是创建yum源索引的工具,后者是提供文件在线流浪的功能,当然,除了httpd之外,你也可以使用nginx替代. creater ... 
- windows下使用LibreOffice的体验
			我在家里一般是使用Ubuntu,学校这个网络需要e信拨号,还是只能用Windows主用,以前我在Ubuntu一直使用的是LibreOffice,这次看见学校电脑很乱了就重装了系统,MSOffice真的 ... 
- IDEA新建一个Project和Module的问题
- Java日期时间(Date/Time)
			获取当前日期和时间 在Java中容易得到当前的日期和时间.可以使用一个简单的Date对象的toString()方法,如下所示打印当前日期和时间: import java.util.Date; publ ... 
- P4091 [HEOI2016/TJOI2016]求和
			留待警戒 FFT的时候长度要写的和函数里一样啊XD 瞎扯 这是个第二类斯特林数的理性愉悦颓柿子题目 颓柿子真的是让我hi到不行啦(才没有) 前置芝士 一个公式 \[ \sum_{i=0}^n t^i ... 
- LOJ6284 数列分块入门8(分块)
			两个锅 一个是sametag[i]==c 另一个是a[j]不要写成a[i] #include <cstdio> #include <cstring> #include < ... 
- (zhuan) Using convolutional neural nets to detect facial keypoints tutorial
			Using convolutional neural nets to detect facial keypoints tutorial this blog from: http://danieln ... 
