java - Spring 自定义注解

标签 java spring annotations

我不确定是否可以轻松地做我想做的事。我有以下 Controller ,它既可以用作休息 Controller ,也可以用作 websocket Controller :

@RestController
@RequestMapping("rest/user")
@MessageMapping("/user")
public class UserController {

    @Autowired
    private UserRepo userRepo;

    @RequestMapping("/list")
    @MessageMapping("/list")
    @SendTo("/channel/user")
    public apiResImpl list() {      
        Iterable<UserImpl> users = userRepo.findAll();  
        return users != null ? new apiResImpl("success", users) :  new apiResImpl("fail");
    }

 ...

我想将这些注释中的几个包装在两个自定义注释@ApiController 和@ApiMapping 中

像这样:

@ApiController("/user")
public class UserController {

    @Autowired
    private UserRepo userRepo;

     @ApiMapping("/list")
     public apiResImpl list() {     
         Iterable<UserImpl> users = userRepo.findAll(); 
         return users != null ? new apiResImpl("success", users) :  new apiResImpl("fail");
     }

 ...

我遇到的问题是能够将值传递到内部传递给 spring 注释的自定义注释中。这个@interface 会是什么样子?有例子吗?

谢谢!

最佳答案

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@RequestMapping // meta-annotated RequestMapping 
@MessageMapping // meta-annotated MessageMapping
public @interface ApiController {

     @AliasFor(annotation = RequestMapping.class, attribute = "value") // -> alias for RequestMapping value attribute
     String[] value() default {};

     @AliasFor(annotation = MessageMapping.class, attribute = "value") // -> alias for MessageMapping value attribute
     String[] mvalue() default{};   
}


@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@RequestMapping
@MessageMapping
public @interface ApiMapping {

    @AliasFor(annotation = RequestMapping.class, attribute = "value")
    String[] value() default {};

    @AliasFor(annotation = MessageMapping.class, attribute = "value")
    String[] mvalue() default {};

    @AliasFor(annotation = RequestMapping.class, attribute = "method")
    RequestMethod[] method() default {};
}

引用下面的链接,我想出了这个解决方案,使用这种技术,我们可以为元注释注释的属性指定一个别名,即(这里是 RequestMapping、MessageMapping)。

AliasFor 的一个缺点是,它是不可重复的注解。

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#_core_container_improvements_2

关于java - Spring 自定义注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27751088/

相关文章:

java - 如何将Java程序转成jar?

java - 在 spring 上下文初始化开始之前执行一段 java 代码

json - 我希望我的 controlleradvice 在处理异常时总是产生 JSON

java - 如何将字符串打印到另一个应用程序的对话框?

java - 将字符串转换为日期的问题

java - PreAuthenticatedAuthenticationProvider UsernameNotFound 异常返回 401 而不是拒绝页面

java - 注释变量可以在运行时确定吗?

json - 根据用户角色控制字段可见性

java - 如何使用 Micronaut 客户端注释映射 errorType

java - 这个for循环的大O分析