java - 是否有任何选项可以在 spring boot 中为所有 @RequestHeaders 添加默认值?

标签 java spring spring-boot header request-headers

是否有任何选项可以为 spring boot 中的所有 @RequestHeader 添加默认值?

@RequestHeader(value = "User-Accept-Language", defaultValue = "en-IN") String localeCd

我正在复制/粘贴到所有 API。避免代码重复的任何帮助!!

最佳答案

我没有找到任何已经完成的用于添加带有值的 header 的注释,所以我自己做了。这是代码,很简单,我是用spring AOP做的

  1. 我创建了注解类

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface ResponseHeader {
    
        public String key() default "";
    
        public String value() default "";
    }
    

    还有一个包含一组 Headers 注释的

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface ResponseHeaders {
    
        public ResponseHeader[] headers();
    }
    
  2. 用于捕获 restController 的 AOP 类(您可以根据需要自定义 AOP 以设置您自己的切入点:

    import YOUR_PACKAGE_ANNOTATION.ResponseHeaders;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletResponse;
    import java.util.List;
    
    /**
     * Aspect for inserting headers on the methods of the @RestController         
     annotated classes
     */
     @Aspect
     @Component
     public class ResponseHeadersAnnotation {
    
     /**
     * Pointcut for filtering just classes with @RestController annotation
     */
    @Pointcut("@within(org.springframework.web.bind.annotation.RestController)")
    public void restControllerClass() {
    }
    
    /**
     * It adds the headers to the response of the method of the controller
     *
     * @param responseHeaders
     */
    @After("restControllerClass() && @annotation(responseHeaders)")
    public void addHeaders(final ResponseHeaders responseHeaders) {
        final HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
        List.of(responseHeaders.headers()).forEach(responseHeader -> response.setHeader(responseHeader.key(), responseHeader.value()));
     }
    }
    
  3. 这是一个如何在 Controller 中使用它的例子:

    @GetMapping(value = {"/ServiceTicketCollection", "/ServiceRequestCollection"})
    @ResponseHeaders(headers = {
            @ResponseHeader(key = "cookie1", value = "value1"),
            @ResponseHeader(key = "cookie2, value = "value2")
    })
    public Object restControllerMethod() {
        ...
    }
    

关于java - 是否有任何选项可以在 spring boot 中为所有 @RequestHeaders 添加默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65000113/

相关文章:

java - 呃争议..这是一个好习惯吗?

java - 如何将字典项序列化为类的平面属性?

当值相等时,Spring security 编码的密码看起来不像 BCrypt

java - 在 Spring Boot 中使用 MDC 或任何过滤器屏蔽日志消息中的密码,而不使用 logback.xml 文件

spring-boot - 我们如何在pcf中为微服务配置API网关、服务发现?

java - Google App Engine - 如何处理数据存储区超时异常?

java - 如何通过 Java 代码访问配置文件(在 pom.xml 中)中设置的值

具有滚动文本和图像的 Java GUI

java - Spring Boot Hibernate 中的 H2 DB 不生成 Db Schema

java - 映射嵌套元素 - Mapstruct