首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Boot在运行时操作http参数

Spring Boot在运行时操作http参数
EN

Stack Overflow用户
提问于 2020-01-14 17:03:41
回答 2查看 693关注 0票数 0

我试图操纵一些http参数,但没有成功(在查询中,body .)在最终端点接收到调用之前。例如,我们接到了这样的帖子:

代码语言:javascript
复制
curl -X POST "http://localhost:8080/insertBody/" -H "accept: application/json" -H "Content-Type: application/json" -H "Date-Format: yyyy-MM-dd" -d "{ \"isUniform\": true, \"myDate\": \"2020-01-14T08:55:07.013Z\", \"myInt\": 0, \"uniform\": true}"

我要做的是将myDate -> 2020-01-14T08:55:07.013Z在post正文中转换为这样的格式:yyyy dd在标题中传递。操作必须涉及此调用中存在的所有类型为OffsetDateTime的对象(在本例中)。

当微型服务接收到呼叫时:

代码语言:javascript
复制
Header:
  Date-Format: yyyy-MM-dd
Body
  {
    "isUniform": true,
    "myDate": "2020-01-14T08:55:07.013Z",
    "myInt": 0,
    "uniform": true
  }

在数据操作和控制器接收到的信息之后:

代码语言:javascript
复制
Header:
  Date-Format: yyyy-MM-dd
Body
  {
    "isUniform": true,
    "myDate": "2020-01-14",   <---
    "myInt": 0,
    "uniform": true
  }

体类

代码语言:javascript
复制
public class CashBackCampaignRequest   {

  @JsonProperty("uniform")
  private Boolean uniform = true;

  @JsonProperty("myInt")
  private Integer myInt = null;

  @JsonProperty("myDate")
  private OffsetDateTime myDate = null;

  // getter setters ...
}
EN

回答 2

Stack Overflow用户

发布于 2020-01-14 18:19:25

你应该使用著名的RequestBodyAdviceAdapter。在进入控制器之前,您可以操纵消息的主体。您可以声明一个@ControllerAdvice@RestControllerAdvice (它只是一个@Component),并扩展类RequestBodyAdviceAdapter。(您也可以实现接口RequestBodyAdvice,但我建议扩展抽象类)。

下面是一个简单的例子:

代码语言:javascript
复制
@RestControllerAdvice
public class WebAdvice extends RequestBodyAdviceAdapter {

    @Override
    public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
        // to know whether you will use your advice or not
        return true;
    }

    @Override
    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
        String format = inputMessage.getHeaders().get("DATE_FORMAT").get(0);
        if(body instanceof CashBackCampaignRequest) {
            // Do whatever you want
            ((CashBackCampaignRequest) body).setDate()
        }
        return super.afterBodyRead(body, inputMessage, parameter, targetType, converterType);
    }
}

请注意Controller中收到的请求的类型。如果控制器接收到CashBackCampaignRequest类型的对象,则无法更改格式。

票数 1
EN

Stack Overflow用户

发布于 2020-01-15 12:12:06

基于RUARDO的RequestBodyAdviceAdapter ResponseBodyAdvice< Object>

代码语言:javascript
复制
@ControllerAdvice
public class ResponseJsonFilterAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        // true if want to use this controller
        return true;
    }

    @Override
    public Object beforeBodyWrite(
            Object body, 
            MethodParameter returnType, 
            MediaType selectedContentType,
            Class<? extends HttpMessageConverter<?>> selectedConverterType, 
            ServerHttpRequest request,
            ServerHttpResponse response) {

        List<String> headers = request.getHeaders().get("X-MY-DATE-FORMAT");
        if(headers == null || headers.isEmpty())
            return body;


        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());  
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(OffsetDateTime.class, new JsonSerializer<OffsetDateTime>() {
            @Override
            public void serialize(OffsetDateTime offsetDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
                jsonGenerator.writeString(DateTimeFormatter.ofPattern(headers.get(0)).format(offsetDateTime));
            }
        });
        objectMapper.registerModule(simpleModule);

        try {
            return objectMapper.writeValueAsString(body);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return body;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59738553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档