spring boot isAnnotationPresent注解 加上@Retention(RetentionPolicy.RUNTIME) 也无效 @Target使用的是ElementType.FIELD
时间: 2024-03-09 12:04:59 浏览: 76
如果你的注解`@Retention`为`RUNTIME`,`@Target`指定了`ElementType.FIELD`,但是`isAnnotationPresent`仍然无法获取到注解信息,那么可能的原因有以下几个:
1. 注解定义的时候忘记添加`@Retention(RetentionPolicy.RUNTIME)`或`@Target(ElementType.FIELD)`元注解,或者注解定义的方式有误,导致无法正确解析注解。
2. 访问的目标对象或者目标属性不是在运行时被加载的,导致注解信息无法被正确解析。可以检查一下目标对象是否已经被正确地加载到内存中。
3. 如果目标对象是通过反射机制动态生成的,那么需要使用反射获取注解信息。具体可以参考以下代码:
```java
Field field = obj.getClass().getDeclaredField(fieldName);
Annotation annotation = field.getAnnotation(MyAnnotation.class);
if (annotation != null) {
// 注解存在
} else {
// 注解不存在
}
```
其中,`obj`为目标对象,`fieldName`为目标属性名,`MyAnnotation`为自定义注解。使用`getDeclaredField`方法获取目标属性,再使用`getAnnotation`方法获取注解信息。如果返回值不为`null`,则表示注解存在。
相关问题
spring boot自定义注解 传参接参
### 创建和使用带参数的自定义注解
在Spring Boot中创建并使用带有参数的自定义注解涉及几个关键步骤。这些步骤包括定义注解、配置组件扫描以及利用AOP或其他方式处理注解逻辑。
#### 定义自定义注解
首先,需要定义一个新的注解类,并指定其元数据属性。这可以通过`@interface`关键字完成。为了使该注解能够携带参数,可以在定义时声明相应的成员变量。下面展示了一个简单的例子:
```java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 设置注解的作用范围为目标方法或字段级别
@Target({ ElementType.METHOD, ElementType.FIELD })
// 设定注解保留策略为运行时可见
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
// 注解可以接受字符串类型的参数,默认为空串
String value() default "";
}
```
此部分展示了如何定义一个名为`CustomAnnotation`的简单注解,它可以应用于方法或字段上,并允许传入一个可选的字符串参数[^1]。
#### 处理自定义注解
一旦定义好了注解,下一步就是决定在哪里以及怎样去读取这个注解的信息。对于大多数场景来说,最常用的方法之一是借助于面向切面编程(AOP),即通过编写AspectJ风格的切面来拦截被标记了特定注解的目标对象/行为。
这里给出一段基于AOP实现的例子,用于捕获任何带有上述自定义注解的方法调用,并打印出所附带的消息内容:
```java
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class AnnotationProcessor {
@Before("@annotation(customAnnotation)")
public void process(JoinPoint joinPoint, CustomAnnotation customAnnotation){
System.out.println("Intercepted method call with message: "
+ customAnnotation.value());
}
}
```
这段代码实现了对所有标注有`CustomAnnotation`的地方进行前置增强(`@Before`)的功能,每当匹配到这样的地方就会触发相应的行为——在这里是指向控制台输出一条信息[^2]。
#### 应用实例
最后一步是在实际业务逻辑里运用之前准备好的工具。比如在一个控制器(Controller)内部添加这样一个注解,并为其提供具体的参数值:
```java
@RestController
@RequestMapping("/example")
public class ExampleController {
@CustomAnnotation(value="This is a test.")
@GetMapping("/test")
public ResponseEntity<String> getTest(){
return new ResponseEntity<>("Success", HttpStatus.OK);
}
}
```
当访问路径 `/example/test` 时,除了正常的HTTP响应外,还会看到由前面提到的那个方面程序产生的额外日志条目,显示了来自注解内的消息文本[^4]。
spring boot 校验手机号
使用 Spring Boot 中的校验框架可以方便地对手机号进行校验。具体实现步骤如下:
1. 引入依赖
在 `pom.xml` 文件中引入 `spring-boot-starter-validation` 依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
```
2. 编写手机号校验注解
在需要校验手机号的参数上加上自定义的注解 `@Phone`,如下所示:
```java
public class User {
@NotBlank(message = "用户名不能为空")
private String username;
@Phone(message = "手机号格式不正确")
private String phone;
// getter 和 setter 方法
}
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
@Documented
public @interface Phone {
String message() default "手机号格式不正确";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
```
其中,`@Phone` 注解的实现需要指定校验逻辑,即 `PhoneValidator` 类的实现。
3. 实现手机号校验逻辑
在 `PhoneValidator` 类中实现手机号的校验逻辑,如下所示:
```java
public class PhoneValidator implements ConstraintValidator<Phone, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
String regx = "^1[3|4|5|7|8][0-9]{9}$";
return Pattern.matches(regx, value);
}
}
```
在校验手机号时,如果手机号为 `null` 则直接返回 `true`,否则使用正则表达式匹配手机号格式。如果匹配成功,则返回 `true`,否则返回 `false`。
4. 进行手机号校验
在需要校验手机号的方法中,使用 `@Valid` 注解标注需要校验的对象,如下所示:
```java
@RestController
public class UserController {
@PostMapping("/users")
public User createUser(@Valid @RequestBody User user) {
return user;
}
}
```
在请求时,如果手机号格式不正确,会返回 `400 Bad Request`,并提示手机号格式不正确。如果手机号格式正确,则正常创建用户。
阅读全文