当前位置: 首页 > 知识库问答 >
问题:

使用BeanPostProcessor在Spring中进行自定义注释

池庆
2023-03-14

我们正在尝试在Spring中为我们的rest api创建一个自定义注释。我是创建自定义注释的新手,我已经给出了下面的代码片段

Spring Boot应用程序--

@SpringBootApplication
@ComponentScan(basePackageClasses = {ServiceController.class, CustomAnnotatorProcessor.class})
public class ServiceApp {
    public static void main(String[] args) {            
        SpringApplication.run(ServiceApp.class, args);
    }
}

RestController-

@RestController
public class ServiceController {

    @RequestMapping(method = RequestMethod.GET, value="/service/v1/version")
    @ApiResponses(value = { 
            @ApiResponse(code = 200, message = "Success", response = String.class),
            @ApiResponse(code = 401, message = "Unauthorized"),
            @ApiResponse(code = 403, message = "Forbidden"),
            @ApiResponse(code = 404, message = "Not Found"),
            @ApiResponse(code = 500, message = "Failure")}) 
    @CustomAnnotation()
    public String getVersion() {
        return "success";
    }
}

自定义注释--

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface CustomAnnotation {

}

注解处理器

@Component
public class CustomAnnotatorProcessor implements BeanPostProcessor {    

private ConfigurableListableBeanFactory configurableBeanFactory;

@Autowired
public CustomAnnotatorProcessor(ConfigurableListableBeanFactory beanFactory) {
    this.configurableBeanFactory = beanFactory;
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    return bean;
}

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    MethodCallback methodCallback = new CustomAnnotationMethodCallback(configurableBeanFactory, bean);
    ReflectionUtils.doWithMethods(bean.getClass(), methodCallback);
    return bean;
}

方法回调--

public class CustomAnnotationMethodCallback implements MethodCallback{
    @Override
    public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
        if (method.isAnnotationPresent(CustomAnnotation.class)) {
            System.out.println("doWith is getting called for CustomAnnotationMethodCallback");
            ReflectionUtils.makeAccessible(method);     
            //DO VALIDATION WHETHER A SPECIFIC HEADER IS PRESENT IN THE GIVEN REQUEST
            return;
        }       
    }

}   

我试图处理自定义注释在一个类中实现BeanPost处理器,但我有一个问题

Issue_1:回调被html" target="_blank">调用一次,但是我不能对 /service/v1/version应用编程接口的每个请求应用验证。我需要验证每个请求,如果是,我们的设计/方法是否正确如何解决这个问题,如果不是,请建议不同的方法

问题2:如果我需要将完整的请求对象(与标题一起)传递给@customAnnotation,我应该如何做?

如果你需要更多细节,请告诉我

谢谢

共有2个答案

羊舌自强
2023-03-14

问题1:回调调用了一次,但我无法对/service/v1/versionAPI的每个请求应用验证。我需要验证每个请求,我们的设计/方法正确吗?如果正确,如何解决这个问题?如果不正确,请建议不同的方法

Issue_2:如果我需要将完整的请求对象(单独与头部一起)传递给我的@CustAnnoection,我应该怎么做?

我认为应该使用spring AOP或Interceptor,而不是Annotation。

邰建业
2023-03-14

为了处理定制注释@validateAuthentication,我们创建了扩展HandlerInterceptorAdapter的拦截器类。

我们在preHandle(HttpServletRequest、HttpServletResponse、Object handler)方法中实现了对请求头的验证。

 类似资料:
  • 我正在尝试使用Spring安全注释,如@PreAuthorize和@安全,但我希望评估用户不是在一个角色上,而是他们是否拥有对特定实体的权限,在这种情况下是一家公司。在我的控制器中,我收到一个超文本传输协议请求,其中包含一个firmId作为参数,我想确保这个用户被允许进入这家公司。是否可以使用当前的Spring安全注释?。我正在寻找一个优雅的解决方案,我一直在寻找自定义约束验证器作为jsr303规

  • 我正在使用mssql和spring数据JPA,我想通过使用自定义查询注释将新记录插入到表中。 它的给定错误, 原因:组织。冬眠hql。内部的ast。QuerySyntaxException:应为打开,在第1行第23列[插入到客户值(?1,?2)]附近找到“值” 我也试过下面,同样的错误。

  • 我想确保在创建新用户名或更新用户名时,用户名是唯一的。我写了下面的代码,它可以很好地创建和更新用户名。但是,如果只更新其他用户字段,如年龄或性别,并保留相同的用户名,它将返回invalid,因为用户名已经存在。 重要的是,我想要的验证是使用BindingResault。我已经有一个数据库,将用户名视为唯一的限制。但是现在我想要用BindingResault进行同样的验证。但是我更新用户时的方式会导

  • 如何计算方面中的Spring Security表达式?我想我可以很容易地使用完成这项工作的类I spring框架

  • 我在网上搜索了一个关于如何使用Spring AOP调用自定义方法注释的清晰示例,但没有找到一个清晰的示例。 我正在构建一个框架,以便在调用任何POJO上的某些方法时在上下文中注入用户配置文件。 框架API应该通过自定义方法注释调用,例如。我可以构建注释部分和解析器,我的问题是在调用带注释的方法时调用我的解析器的最佳方式是什么。 我们正在使用Spring 3.0,想知道配置Spring框架以理解那些

  • 嘿,伙计们,我是拉威尔的新手,我正在尝试为和创建一个登录系统,管理员可以在其中注册和编辑用户详细信息。我知道Laravel有一个内置的身份验证系统,但它没有编辑用户详细信息的功能。我认为有两种选择可能有效 使用现有的身份验证系统进行注册/登录,同时添加一个新的控制器和视图来编辑用户的详细信息。 使用新的迁移表从头开始创建新的注册/登录系统,并实现编辑功能。但我关心的是,如果我从头开始创建如何使用A