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 ...
随机推荐
- 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165211
目录 软件和镜像下载 虚拟机软件 Kali系统的下载 Kali系统安装 网络配置 设置共享文件夹和剪切板 安装VMware增强工具 设置共享文件夹 设置共享剪切板 更新软件源 软件和镜像下载 虚拟机软 ...
- bzoj 3262 陌上花开 - CDQ分治 - 树状数组
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- cJSON库的简单介绍及使用
转载:http://www.cnblogs.com/liunianshiwei/p/6087596.html JSON 语法是 JavaScript 对象表示法语法的子集.数据在键/值对中:数据由逗号 ...
- tp框架中的一些疑点知识-1
tp默认的编码是utf-8 Runtime中的Cache和Logs都是分模块的,因为在应用app下可以有多个模块,但是 公共模块和Runtime模块只有一个, 所以, Runtime要包含各个模块的内 ...
- SP10707 COT2 - Count on a tree II 莫队
链接 https://vjudge.net/problem/SPOJ-COT2 https://www.luogu.org/problemnew/show/SP10707 思路 dfs欧拉序转化为普通 ...
- 【配置】log4j.properties 详解与配置步骤
一.Log4j基本使用方法 Log4j由三个重要的组件构成:[日志信息的优先级],[日志信息的输出目的地],[日志信息的输出格式]. 日志信息的优先级从高到低有ERROR.WARN. INFO.DEB ...
- html 之 浮动(待补充)
通过设置float 样式属性来决定区块标签的浮动 问题:区块与非区块浮动的特点(左右) 区块与区块浮动的特点(左右) ie浏览器与谷歌等浏览器的效果差异
- 第一章(欢迎进入node.js世界)
本章内容 1:Node.js是什么 2:服务器端javascript 3:node的异步和事件触发本质 4:node为谁而生 5:node程序示例 1.1 node.js他的首次亮相是在2009年,非 ...
- Cas单点登录配置数据查询用户
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- js为什么返回两个对象字符串 objcet objcet ?
js中两个使用 toString() 对有个有对象的数组进行操作时,为什么返回两个对象字符串 objcet objcet ? [{}].toString(); 返回 "[object Obj ...