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;
         }

       }
    }