springboot 自定义注解开发

适用场景:

        同一个实体类(User)在多个地方用到,但是属性password只能设置为符合指定规则的字符,此时我们有pc和app端两处入口可以维护user的这个attribute,假设两处入口走不同的业务逻辑,我们在没处logic都需要对password进行check,万一哪天这个role修改了,我们对使用logic的地方也要进行单一修改,费时容易修改不全。这种情况下我们可以选择通过@interface的方式进行check,这样相同的role只需要修改一次就ok。

 

//定义注解要执行的方法

/**
*自定义的注解执行方法
*/
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
//实现接口,自动注入为bean
public class MyConstraintValidation implements ConstraintValidator<MyConstraint, Object> {//<MyConstraint, Object> 绑定注解MyConstraint,指定类型Object为任意类型
	//此处可通过@autowired注入任何bean中已有的内容
	@Override
	public boolean isValid(Object value, ConstraintValidatorContext context) {
		//指定的逻辑
		System.out.println("执行指定的逻辑,false校验不过,true校验通过");
		System.out.println("value"+value);
		System.out.println("context"+context);
		return false;
	}


}

 

//创建自定义注解

/**
*自定义注解
*/
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

//自定义注解类
@Target({ElementType.METHOD,ElementType.FIELD})//标识注释到哪里,方法和字段,可以根据需求设定
@Retention(RetentionPolicy.RUNTIME)//运行时注解
@Constraint(validatedBy=MyConstraintValidation.class)//注解执行的校验类
public @interface MyConstraint {
	//这三个方法必须要有
	String message();//提示信息

	Class<?>[] groups() default { };

	Class<? extends Payload>[] payload() default { };

}

使用到实体类上


import java.util.Date;

import javax.validation.constraints.NotBlank;

import com.fasterxml.jackson.annotation.JsonView;
import com.ztx.voladitor.MyConstraint;

public class User {
	private int id;
    //此注解为自定义注解 设置message为如果校验不过要return的message
	@MyConstraint(message="username")
	private String username;
	@NotBlank
	private String password;
	
	private Date birthday;
	public interface UserSimpleView {};
	public interface UserDetailView extends UserSimpleView {};
	
	
	@JsonView(UserSimpleView.class)//UserSimpleView试图下显示
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	@JsonView(UserSimpleView.class)//UserSimpleView试图下显示
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@JsonView(UserSimpleView.class)//UserSimpleView试图下显示
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	@JsonView(UserDetailView.class)//视图下显示
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

/方法中使用

@JsonView(User.UserSimpleView.class)
	//@RequestMapping(value="/user",method = RequestMethod.GET)
	@PostMapping
	public User create(@Valid @RequestBody User user,BindingResult errors) {//校验实体类中的@NotBlank类似注解
		if(errors.hasErrors()) {
			//有错误会打印,
			errors.getAllErrors().stream().forEach(error  -> System.out.println(error.getDefaultMessage()));
		}
		System.out.println(user.getPassword());
		System.out.println(user.getUsername());
		System.out.println(user.getId());
		System.out.println(user.getBirthday());
		user.setId(1);
		return user;
	}
	

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值