Java 如何通过Spring Boot/Tomcat发送json和GET参数?
因此,目前我正在进行一个项目,在这个项目中,我们有产品对象,而产品对象又包含“源”对象(包含Java 如何通过Spring Boot/Tomcat发送json和GET参数?,java,json,spring-boot,parameters,get,Java,Json,Spring Boot,Parameters,Get,因此,目前我正在进行一个项目,在这个项目中,我们有产品对象,而产品对象又包含“源”对象(包含地区:字符串和国家:字符串) 我试图做的是一个RestController,它接收一个可选的原始对象并对其进行操作(例如记录它) 这就是我现在拥有的: @GetMapping("search") public Page<Wine> getProductByStuff( @RequestParam(required = false) Origi
地区:字符串和国家:字符串)
我试图做的是一个RestController,它接收一个可选的原始对象并对其进行操作(例如记录它)
这就是我现在拥有的:
@GetMapping("search")
public Page<Wine> getProductByStuff(
@RequestParam(required = false) Origin origin,
/* other attributes */) {
log.info(origin); // it has a proper toString method.
}
(请参阅,顺便说一句,它已弃用(至少是connector.setAttribute)。)
这产生了:
MethodArgumentConversionNotSupportedException:未能将类型为“java.lang.String”的值转换为所需类型“[Censeded].backend.model.Origin”
我的问题是:
- (如何)可以配置Tomcat/Spring以便它们能够在url参数中实际接受json吗
- 我将如何将其格式化,例如“邮递员”,以使其正常工作?目前,我只是在邮递员的参数选项卡中手动转换特殊字符
如前所述,不要将JSON用作路径参数
直接使用路径参数,并转换为原点
对象
@GetMapping("search")
public Page<Wine> getProductByStuff(
@RequestParam(required = false) String region,
@RequestParam(required = false) String country, /* other attributes */) {
Origin origin = new Origin(region, country);
log.info(origin); // it has a proper toString method.
}
@GetMapping(“搜索”)
公共页getProductByStuff(
@RequestParam(必需=false)字符串区域,
@RequestParam(required=false)字符串country,/*其他属性*/){
原产地=新原产地(地区、国家);
log.info(origin);//它有一个正确的toString方法。
}
- 如果希望将其作为json查询参数发送,则需要执行以下操作
- 注册转换器
@组件
公共类StringToOriginConverter实现
转换器{
ObjectMapper ObjectMapper=新的ObjectMapper();
@凌驾
公共源转换(字符串源){
试一试{
返回objectMapper.readValue(源、源、类);
}捕获(JsonProcessingException e){
//您可以在这里为自定义错误抛出一些异常
返回null;
}
}
}
- 从
邮递员发送
注意
我的答案不是争论你是否应该使用POST
或GET
,因为这不是你所要求的。如果您想以查询参数的形式发送一些有效负载,那么它只提供了一个选项,为什么要尝试使用GET as URL参数发送JSON对象?要在URL中发送,它应该是键/值对。你有什么特殊用途吗?你可以在正文中随POST请求一起发送。我使用GET请求,因为它最适合这种情况(毕竟是一个搜索查询),我不是简单地将origin的属性写入路径,因为它使前端更难,因为我不能将product.origin放在那里,而是必须解构它。如果不可能的话,伊玛可以这么做。@TahaYavuzBodur我非常不同意。你评论的帖子部分。POST应该更改服务器状态,即,如果只获取数据,那么它应该是GET。但我完全同意。JSON部分。请求参数表示为键值对,而不是复杂对象。有关在使用正文时使用GET vs POST的讨论:。目前还没有达成任何共识,但最新的HTTP规范没有提到任何相反的内容,因此我建议使用实际有效的.OMG(在我发现“转换器”来自Spring,而不是Jackson之后)!非常感谢你。我不知道有这样的事情存在!你介意分享你从哪里知道这个吗?我已经用了很长时间了,最近几天还在用这个。嘿,只是一个微笑的问题中的一个小问题。我有另一个接受集合idList的方法,但如果我发送idList=1,2,它会工作,如果我发送idList=[1,2](通过邮递员编码,就像你给我看的那样),它会将其解释为[[1,2]],数字转换失败。我该如何解决这个问题?
@GetMapping("search")
public Page<Wine> getProductByStuff(
@RequestParam(required = false) String region,
@RequestParam(required = false) String country, /* other attributes */) {
Origin origin = new Origin(region, country);
log.info(origin); // it has a proper toString method.
}
@RestController
public class OriginController {
@GetMapping("/search")
public void getOrigin(@RequestParam(value = "origin", required = false)
Origin origin) {
System.out.println(origin);
}
}
@Component
public class StringToOriginConverter implements
Converter<String, Origin> {
ObjectMapper objectMapper = new ObjectMapper();
@Override
public Origin convert(String source) {
try {
return objectMapper.readValue(source, Origin.class);
} catch (JsonProcessingException e) {
//You could throw some exception here instead for custom error
return null;
}
}
}