是否有任何选项可以为 spring boot 中的所有 @RequestHeader
添加默认值?
@RequestHeader(value = "User-Accept-Language", defaultValue = "en-IN") String localeCd
我正在复制/粘贴到所有 API。避免代码重复的任何帮助!!
最佳答案
我没有找到任何已经完成的用于添加带有值的 header 的注释,所以我自己做了。这是代码,很简单,我是用spring AOP做的
我创建了注解类
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(); }
用于捕获 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())); } }
这是一个如何在 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/