@ApiModelProperty(value = "新增或修改的用户数据") @NotNull(message = "用户数据不能为空", groups = {GroupInsert.class, GroupUpdate.class}) private SysUserEntity user;好用,但是SysUserEntity@NotEmpty(message = "工号/用户编码不能为空", groups = {GroupInsert.class, GroupUpdate.class})在实体类中不好用
时间: 2024-02-25 08:55:23 浏览: 102
`@ApiModelProperty`注解是用来描述实体类属性的,通常用于生成API文档。而`@NotNull`注解是用来校验表单数据时验证对象非空的,可以用在实体类中作为对象的注解。
如果你在实体类中想要对`SysUserEntity`对象的`code`属性进行非空校验,可以在`SysUserEntity`类中添加`@NotEmpty`注解来实现:
```java
public class SysUserEntity {
@NotEmpty(message = "工号/用户编码不能为空", groups = {GroupInsert.class, GroupUpdate.class})
private String code;
// other fields and methods
}
```
这样在校验表单数据时,如果`user`对象的`code`属性为空,就会抛出校验异常。同时,由于`user`属性上添加了`@NotNull`注解,如果`user`对象为空,也会抛出校验异常。
希望这个解答能够帮助到你,如果还有问题,请继续提问。
相关问题
@Data @AllArgsConstructor @NoArgsConstructor @Builder @Table(name = "advert") public class Advert { /** * 主键 / @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @ApiModelProperty(value = "广告唯一id") private Integer id; /* * 广告名称 / @ApiModelProperty(value = "广告名称") @NotBlank(message = "广告名称不可为空", groups = {AddGroup.class, UpdateGroup.class}) private String name; /* * 广告位置ID / @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "position_id") private AdPosition position; /* * 广告图片ID / @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "media_id") private MediaFile media; /* * 开始日期 / @Column(name = "start_date") @ApiModelProperty(value = "开始日期") @NotNull(message = "开始日期不可为空", groups = {AddGroup.class}) private Date startDate; /* * 结束日期 / @Column(name = "end_date") @ApiModelProperty(value = "结束日期") @NotNull(message = "结束日期不可为空", groups = {AddGroup.class}) private Date endDate; /* * 广告链接 / @ApiModelProperty(value = "广告链接") @NotBlank(message = "广告链接不可为空", groups = {AddGroup.class}) private String link; /* * 广告状态:0:未启用,1:已启用,2:已结束 / @ApiModelProperty(value = "广告状态") @NotNull(message = "广告状态不可为空", groups = {UpdateGroup.class}) private Integer status; /* * 创建时间 / @Column(name = "create_time") @ApiModelProperty(value = "创建时间") private Date createTime; /* * 更新时间 */ @Column(name = "update_time") @ApiModelProperty(value = "更新时间") private Date updateTime; },对这个类的对象进行添加和修改时,因为在server层有大量重复代码,如何简化代码并避免并发问题
可以使用Spring Data JPA中的`CrudRepository`或`JpaRepository`接口来简化代码,并避免并发问题。
首先,定义一个通用的BaseService类,其中包含常用的CRUD操作:
```
public abstract class BaseService<T, ID extends Serializable> {
@Autowired
protected JpaRepository<T, ID> repository;
public T save(T entity) {
return repository.save(entity);
}
public T findById(ID id) {
return repository.findById(id).orElse(null);
}
public void delete(T entity) {
repository.delete(entity);
}
public void deleteById(ID id) {
repository.deleteById(id);
}
public List<T> findAll() {
return repository.findAll();
}
public Page<T> findAll(Pageable pageable) {
return repository.findAll(pageable);
}
}
```
然后,定义一个AdvertService类,继承BaseService,并添加一些特定的业务方法:
```
@Service
public class AdvertService extends BaseService<Advert, Integer> {
@Autowired
private AdvertRepository advertRepository;
public List<Advert> findByStatus(Integer status) {
return advertRepository.findByStatus(status);
}
public List<Advert> findByPositionId(Integer positionId) {
return advertRepository.findByPositionId(positionId);
}
// add other business methods here
}
```
在AdvertRepository接口中定义需要的查询方法:
```
public interface AdvertRepository extends JpaRepository<Advert, Integer> {
List<Advert> findByStatus(Integer status);
List<Advert> findByPositionId(Integer positionId);
// add other query methods here
}
```
最后,在controller层中使用AdvertService来进行增删改查操作:
```
@RestController
@RequestMapping("/advert")
public class AdvertController {
@Autowired
private AdvertService advertService;
@PostMapping("/add")
public Result add(@RequestBody Advert advert) {
advertService.save(advert);
return Result.success();
}
@PostMapping("/update")
public Result update(@RequestBody Advert advert) {
advertService.save(advert);
return Result.success();
}
// add other controller methods here
}
```
这样做可以避免重复的代码,同时也可以有效地避免并发问题。由于Spring Data JPA会自动处理事务,因此在进行增删改操作时,可以确保数据的一致性。
@Data @AllArgsConstructor @NoArgsConstructor @Builder @Table(name = "advert") public class Advert { /** * 主键 */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @ApiModelProperty(value = "广告唯一id") private Integer id; /** * 广告名称 */ @ApiModelProperty(value = "广告名称") @NotBlank(message = "广告名称不可为空", groups = {AddGroup.class, UpdateGroup.class}) private String name; /** * 广告位置ID */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "position_id") private AdPosition position; /** * 广告图片ID */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "media_id") private MediaFile media; /** * 开始日期 */ @Column(name = "start_date") @ApiModelProperty(value = "开始日期") @NotNull(message = "开始日期不可为空", groups = {AddGroup.class}) private Date startDate; /** * 结束日期 */ @Column(name = "end_date") @ApiModelProperty(value = "结束日期") @NotNull(message = "结束日期不可为空", groups = {AddGroup.class}) private Date endDate; /** * 广告链接 */ @ApiModelProperty(value = "广告链接") @NotBlank(message = "广告链接不可为空", groups = {AddGroup.class}) private String link; /** * 广告状态:0:未启用,1:已启用,2:已结束 */ @ApiModelProperty(value = "广告状态") @NotNull(message = "广告状态不可为空", groups = {UpdateGroup.class}) private Integer status; /** * 创建时间 */ @Column(name = "create_time") @ApiModelProperty(value = "创建时间") private Date createTime; /** * 更新时间 */ @Column(name = "update_time") @ApiModelProperty(value = "更新时间") private Date updateTime; },这个类进行添加和修改时,因为有大量重复代码,如何简化代码并避免并发问题
可以使用Lombok提供的@Builder注解简化代码,并且使用@Transactional注解来实现数据库的事务控制,避免并发问题。简化后的代码如下:
```
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table(name = "advert")
public class Advert {
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ApiModelProperty(value = "广告唯一id")
private Integer id;
/** 广告名称 */
@ApiModelProperty(value = "广告名称")
@NotBlank(message = "广告名称不可为空", groups = {AddGroup.class, UpdateGroup.class})
private String name;
/** 广告位置ID */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "position_id")
private AdPosition position;
/** 广告图片ID */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "media_id")
private MediaFile media;
/** 开始日期 */
@Column(name = "start_date")
@ApiModelProperty(value = "开始日期")
@NotNull(message = "开始日期不可为空", groups = {AddGroup.class})
private Date startDate;
/** 结束日期 */
@Column(name = "end_date")
@ApiModelProperty(value = "结束日期")
@NotNull(message = "结束日期不可为空", groups = {AddGroup.class})
private Date endDate;
/** 广告链接 */
@ApiModelProperty(value = "广告链接")
@NotBlank(message = "广告链接不可为空", groups = {AddGroup.class})
private String link;
/** 广告状态:0:未启用,1:已启用,2:已结束 */
@ApiModelProperty(value = "广告状态")
@NotNull(message = "广告状态不可为空", groups = {UpdateGroup.class})
private Integer status;
/** 创建时间 */
@Column(name = "create_time")
@ApiModelProperty(value = "创建时间")
private Date createTime;
/** 更新时间 */
@Column(name = "update_time")
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**
* 保存或更新广告
*/
@Transactional(rollbackFor = Exception.class)
public void saveOrUpdate() {
AdvertRepository advertRepository = SpringContextUtil.getBean(AdvertRepository.class);
if (this.getId() == null) {
// 新增广告
this.setCreateTime(new Date());
advertRepository.save(this);
} else {
// 更新广告
Advert oldAdvert = advertRepository.findById(this.getId()).orElse(null);
if (oldAdvert != null) {
BeanUtils.copyProperties(this, oldAdvert, "id", "createTime");
oldAdvert.setUpdateTime(new Date());
advertRepository.save(oldAdvert);
}
}
}
}
```
这里使用了Spring的@Transactional注解来实现事务控制,同时使用了Spring的工具类SpringContextUtil来获取AdvertRepository的实例。这样,我们就可以在Advert实体类中调用saveOrUpdate方法来进行保存或更新操作,避免了重复代码的出现,并且确保了并发安全。
阅读全文