首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring控制器可以接受ZonedDatedTime为@RequestParam,但不能接受@RequestBody

Spring控制器可以接受ZonedDatedTime为@RequestParam,但不能接受@RequestBody
EN

Stack Overflow用户
提问于 2022-05-26 00:31:22
回答 1查看 53关注 0票数 0

以下代码起作用

代码语言:javascript
运行
复制
public @ResponseBody
Map<String, Object> test(@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) ZonedDateTime startDate,
                                       @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) ZonedDateTime endDate) {

    return null;
}

带着这个请求

代码语言:javascript
运行
复制
https://localhost:8080/api/v1/test?startDate=2000-10-31T01:30:00.000-00:00&endDate=2000-10-31T01:30:00.000-00:00

但是,下面的代码会引发异常

代码语言:javascript
运行
复制
public @ResponseBody
Map<String, Object> test(@RequestBody @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) ZonedDateTime startDate,
                                       @RequestBody @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) ZonedDateTime endDate) {

    return null;
}

用这个身体

代码语言:javascript
运行
复制
 {
    "endDate":"2000-10-31T01:30:00.000-00:00",
    "startDate":"2000-10-31T01:30:00.000-00:00"    
}

有这个例外吗?

代码语言:javascript
运行
复制
[org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected token (START_OBJECT), expected one of [VALUE_STRING, VALUE_NUMBER_INT, VALUE_NUMBER_FLOAT] for java.time.ZonedDateTime value; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected one of [VALUE_STRING, VALUE_NUMBER_INT, VALUE_NUMBER_FLOAT] for java.time.ZonedDateTime value
EN

回答 1

Stack Overflow用户

发布于 2022-05-26 06:06:11

您必须使用@ModelAttribute或make object或map来映射主体,因为反射实用程序没有机会读取函数参数名称(不能为映射指定属性名称)。

代码语言:javascript
运行
复制
public class User {
    private String name;
    private String occupation;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@RestController
public class MyController {
    @ResponseStatus(value = HttpStatus.OK)
    @PostMapping(value="/myfoo")
    public void process2(@ModelAttribute("email") String email) {
    }

    @ResponseStatus(value = HttpStatus.OK)
    @PostMapping(value="/vals")
    public void process(@RequestBody MultiValueMap<String, String> values) {
    }

    @ResponseStatus(value = HttpStatus.OK)
    @PostMapping(value="/user", consumes = MediaType.APPLICATION_JSON_VALUE)
    public void process2(@RequestBody User user) {
    }
}

注意

始终为@RequestParam设置属性名称,否则如果有人不仅添加此参数或更改函数签名,您可能会出错。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72385456

复制
相关文章

相似问题

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