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

  

上一篇:Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)


下一篇:jqPlot图表插件学习之柱形图和旋转分类名称