【问题标题】:Spring get request to Object mapping customisation waysSpring get请求对象映射自定义方式
【发布时间】:2015-11-23 08:42:21
【问题描述】:

我想知道如何将 Spring Controller GET 请求映射到我的对象。

我有一种情况,我为单个搜索 API 启用了 GET 和 POST 请求。

我收到我的 POST api 作为 JSON 数据类型并使用

CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

将 json 转换为我的对象的策略。

这会在我的 Java modal 中将 date_to 字段转换为 dateTo。

但如果我通过 GET 收到相同的请求,我需要传递 dateTo 而不是 date_to。这给最终用户带来了很多困惑。

我正在寻找类似下面的东西

class MySearchRequestDTO{
    private int start = 0;
    private int count = 10;

    @RequestAttribute(name="date_from")
    private Date dateFrom;

    @RequestAttribute(name="date_to")
    private Date dateTo;

    //Getters and Setters
}

控制器类

@RequestMapping(value = "/search", method = {RequestMethod.GET})
public ApiSuccessResponse aSearchGet(MySearchRequestDTO request) throws IMSException{
    return new ApiSuccessResponse(inventoryService.aSearch(request));
}

@RequestMapping(value = "/search", method = {RequestMethod.POST})
public ApiSuccessResponse aSearchPost(@RequestBody MySearchRequestDTO request) throws IMSException{
    return new ApiSuccessResponse(inventoryService.aSearch(request));
}

在这种情况下,在我的应用程序 url 类型中遵循相同名称策略的最佳方法是什么。让我知道是否有人以更好的方式解决了这个问题。

非常感谢您花时间阅读本文。

【问题讨论】:

  • 为什么不随心所欲地更改变量名称?
  • 我的模型使用骆驼大小写符号。我的 json 基于基于下划线的符号。我不喜欢在我的 java 类及其组织范围的标准中使用下划线符号,并决定使用 json 作为基于下划线的。如果我准备好使用这样的名字,我不会发布这个。

标签: java json spring spring-mvc httprequest


【解决方案1】:

由于 spring 使用 jackson,以下方法有效。

public class MySearchRequestDTO {
    int test;

    @JsonProperty("t")
    public int getTest() {
      return test;
    }

    @JsonProperty("t")
    public void setTest(int test) {
      this.test = test;
    }
}

然后:

MySearchRequestDTO c = new MySearchRequestDTO();
c.setTest(5);

ObjectMapper mapper = new ObjectMapper();
System.out.println("Serialization: " + mapper.writeValueAsString(c));

MySearchRequestDTO r = mapper.readValue("{\"t\":25}",MySearchRequestDTO.class);
System.out.println("Deserialization: " + r.getTest());

结果:

Serialization: {"t":5}
Deserialization: 25

【讨论】:

  • 我不知道你是否正确地阅读了这个问题。我使用 Jackson 作为序列化程序,并且我已配置为使用 CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES 作为我的命名策略。它会自动以正确的方式对话我的字段名称。 dateTo 到 date_to 以及同时将 date_to 反序列化到 dateTo。如果我将值作为 RequestParams 传递,我的问题同样不会发生在 GET REQUEST 上。希望你能明白我在说什么。
【解决方案2】:

Spring 使用 Jackson 映射器将 json 映射到对象,反之亦然。使用 Jackson,您可以为具体类实现自己的映射器版本,因此只需为您需要的类编写自己的序列化器和反序列化器实现。

【讨论】:

  • 它是否使用 Jackson 将 REquestParams 转换为 Object ?
  • 我完全是在询问 GET 请求参数,而不是关于将 json 对象转换为 POJO,我已经成功地做到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2019-02-14
  • 2023-01-11
相关资源
最近更新 更多