【问题标题】:How to accept GET argument as complex object如何接受 GET 参数作为复杂对象
【发布时间】:2018-06-04 16:41:01
【问题描述】:

我的输入参数是这样的:

2Y - (2 年)
28D - (28 天)
3M - (3 个月)

我想接受这样的论点:

public class InputDateInterval {
    private int count;
    private IntervalType intervalType;
    ...
}

public enum IntervalType {
    DAY("D"),
    MONTH("M"),
    YEAR("Y");

    private String sign;

    IntervalType(String sign) {
        this.sign = sign;
    }

控制器应如下所示:

@GetMapping(...)
public Object(InputDateInterval idi, String anotherArgument, String...) {
    ....
}

如何在spring mvc中实现?

【问题讨论】:

    标签: java spring spring-mvc get


    【解决方案1】:

    你应该将所有参数组合成一个对象,而不是不同的参数。您应该为此使用 POST 方法。

       @PostMapping("/someUri")
        public Object complexObjectMapping(RequestObject request) {
           //do processing for request object as needed
           return something;
        }
    

    您应该为您的复杂请求对象定义一个包含所有可能参数的类。

    public class RequestObject{
          private InputDateInterval idi;
          private String anotherArgument;
    
    
          //getter and setter
        }
    

    【讨论】:

    • 我必须使用 GET
    • 然后试试@RequestParam
    • 这无济于事。您需要将解析逻辑放在 spring 基础设施中的某处
    • 我认为这不是您不使用 postmapping 的原因吗?
    • 因为有GET REST的意思
    【解决方案2】:

    你应该使用RequestBody

    @GetMapping
    public void goGetStuff(@RequestBody InputDateInterval inputDateInterval) {
        ...
    }
    

    不过,我还是建议您检查一下您的 API 设计。我不会有超过几个参数的 GET

    【讨论】:

      【解决方案3】:

      标准方式是实现并注册 MvcArgumentResolver 接口。您将可以在您的实现中访问 http 请求对象,然后实现您的自定义逻辑以将请求参数映射到您的自定义参数类型。

      【讨论】:

      猜你喜欢
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      相关资源
      最近更新 更多