java—在SpringBoot中是否有任何选项可以向所有@requestheaders添加默认值?

bweufnob  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(626)

是否有任何选项可以将默认值添加到所有 @RequestHeader 你穿的是春靴吗? @RequestHeader(value = "User-Accept-Language", defaultValue = "en-IN") String localeCd 我正在复制/粘贴所有api。任何帮助,以避免代码重复!!

hmtdttj4

hmtdttj41#

我没有找到任何已经做了有一个添加值的标题注解,所以我自己做了。下面是代码,很简单,我用SpringAOP做的
我创建了注解类

  1. import java.lang.annotation.ElementType;
  2. import java.lang.annotation.Retention;
  3. import java.lang.annotation.RetentionPolicy;
  4. import java.lang.annotation.Target;
  5. @Retention(RetentionPolicy.RUNTIME)
  6. @Target(ElementType.METHOD)
  7. public @interface ResponseHeader {
  8. public String key() default "";
  9. public String value() default "";
  10. }

以及一个包含标题和注解的数组

  1. import java.lang.annotation.ElementType;
  2. import java.lang.annotation.Retention;
  3. import java.lang.annotation.RetentionPolicy;
  4. import java.lang.annotation.Target;
  5. @Retention(RetentionPolicy.RUNTIME)
  6. @Target(ElementType.METHOD)
  7. public @interface ResponseHeaders {
  8. public ResponseHeader[] headers();
  9. }

用于捕捉restcontrollers的aop类(您可以自定义aop,以便根据需要设置自己的切入点:

  1. import YOUR_PACKAGE_ANNOTATION.ResponseHeaders;
  2. import org.aspectj.lang.annotation.After;
  3. import org.aspectj.lang.annotation.Aspect;
  4. import org.aspectj.lang.annotation.Pointcut;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.web.context.request.RequestContextHolder;
  7. import org.springframework.web.context.request.ServletRequestAttributes;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.util.List;
  10. /**
  11. * Aspect for inserting headers on the methods of the @RestController
  12. annotated classes
  13. */
  14. @Aspect
  15. @Component
  16. public class ResponseHeadersAnnotation {
  17. /**
  18. * Pointcut for filtering just classes with @RestController annotation
  19. */
  20. @Pointcut("@within(org.springframework.web.bind.annotation.RestController)")
  21. public void restControllerClass() {
  22. }
  23. /**
  24. * It adds the headers to the response of the method of the controller
  25. *
  26. * @param responseHeaders
  27. */
  28. @After("restControllerClass() && @annotation(responseHeaders)")
  29. public void addHeaders(final ResponseHeaders responseHeaders) {
  30. final HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
  31. List.of(responseHeaders.headers()).forEach(responseHeader -> response.setHeader(responseHeader.key(), responseHeader.value()));
  32. }
  33. }

下面是如何在控制器中使用它的示例:

  1. @GetMapping(value = {"/ServiceTicketCollection", "/ServiceRequestCollection"})
  2. @ResponseHeaders(headers = {
  3. @ResponseHeader(key = "cookie1", value = "value1"),
  4. @ResponseHeader(key = "cookie2, value = "value2")
  5. })
  6. public Object restControllerMethod() {
  7. ...
  8. }
展开查看全部
zpqajqem

zpqajqem2#

这是一个关于如何使用springwebflux为头提供默认值的示例

  1. @Component
  2. public class CorrelationIdFilter implements WebFilter {
  3. @Override
  4. public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
  5. var correlationId = exchange.getRequest().getHeaders().getFirst(CORRELATION_ID_HEADER);
  6. if (correlationId == null || correlationId.isEmpty()) {
  7. correlationId = UUID.randomUUID().toString();
  8. ServerHttpRequest mutatedRequest = exchange.getRequest()
  9. .mutate()
  10. .header(CORRELATION_ID_HEADER, correlationId)
  11. .build();
  12. exchange = exchange
  13. .mutate()
  14. .request(mutatedRequest)
  15. .build();
  16. }
  17. exchange.getResponse().getHeaders().add(CORRELATION_ID_HEADER, correlationId);
  18. return chain.filter(exchange);
  19. }
  20. }

这是给SpringWeb的

  1. @Component
  2. public class CorrelationIdFilter implements Filter {
  3. static final String CORRELATION_ID_HEADER = "X-Correlation-ID";
  4. @Override
  5. public void init(FilterConfig filterConfig) {
  6. // empty
  7. }
  8. @Override
  9. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  10. throws IOException, ServletException {
  11. HttpServletRequest httpRequest = (HttpServletRequest) request;
  12. String correlationId = httpRequest.getHeader(CORRELATION_ID_HEADER);
  13. if (correlationId == null) {
  14. correlationId = XidFactory.nextXid();
  15. ((HttpServletResponse) response).addHeader(CORRELATION_ID_HEADER, correlationId);
  16. }
  17. chain.doFilter(request, response);
  18. }
  19. @Override
  20. public void destroy() {
  21. // empty
  22. }
  23. }
展开查看全部

相关问题