【问题标题】:Can't bind json string to java string无法将 json 字符串绑定到 java 字符串
【发布时间】:2019-06-21 17:44:43
【问题描述】:

我正在尝试将一个 json 字符串传递给 (POJO) java 字符串,但在我的控制器中我没有将该 json 字符串作为 java 字符串。

在前端,

<form th:action="@{/create/ads}" th:object="${createAds}" method="post">
    <div class="allWrap">
        <ul class="dropList odaberiteMarku" th:field="${brand}">

        </ul>
    </div>

    <div class="allWrap mt-s">
        <ul class="dropList odaberiteModel" th:field="${model}">

        </ul>
    </div>
</form>

在控制器中,

@RequestMapping(value="/create/ads", headers="Accept=application/json", method=RequestMethod.POST)
public String submitForm(@RequestBody @ModelAttribute CreateAds ads, BindingResult result, Model model) {
    if (result.hasErrors()) {
        return "test";
    }
    System.out.println(ads.getBrand()+", "+ads.getModels());
    return "successful";
}

在模型类中

public class CreateAds {
    private String brand;
    private String models;
    //other variables
    //all getters and setters 
}

在我的 json 文件中。

[
  {
    "brand": "Acura",
    "models": [
      "2.2CL",
      "2.3CL",
      "3.0CL",
      "TL",
      "TSX",
      "Vigor",
      "ZDX"
    ]
  }
]

在前端: 我有一个外部 json 文件,用于汽车制造商和基于汽车制造商的汽车型号。它在前端运行良好。

在后端: 我正在尝试将 json 字符串绑定到普通字符串,例如 json 品牌字符串应该是 java 品牌字符串,而模型字符串应该是 java 模型字符串。

我认为,我无法将 json 字符串正确绑定到 java 字符串,这就是我得到 null 值的原因。那么我该如何解决这个问题呢?

提前致谢。

【问题讨论】:

  • 您的 json 不包含“模型字符串”,但 models 是一个 array 字符串。这不能绑定到简单的 Java 字符串 - 您要么必须在 POJO 中使用数组/列表,要么选择模型字符串之一并仅发送该单个字符串。
  • 对于模型,暂时还可以。但是为什么要为品牌字符串获取 null 值?
  • 我对 spring boot 不太熟悉,但您的表单似乎不包含任何输入字段。您确定将“品牌”值发送回服务器吗?
  • "brand" 是来自该 json 文件的下拉列表。它应该去服务器,我从不使用 json 字符串 seding。这就是为什么我不确定该值是否发送到服务器。
  • 嗯,您应该能够使用浏览器的开发人员工具来检查发布请求并检查正在发送的数据。

标签: java json spring-boot


【解决方案1】:

除了托马斯的评论(对不起,我还不能评论): 您的端点接受 CreateAds 类的对象,并且您正在显示名为 Ads 的类的 POJO 声明。

【讨论】:

  • 很好,这是一个错误。
【解决方案2】:

我不会谈论你的 UI 代码。

控制器:

@PostMapping("/create/ads")
public String submitForm(@RequestBody CreateAds ads, BindingResult result, Model model){
    if (result.hasErrors()) {
        return "test";
    }
    System.out.println(ads.getBrand()+", "+ads.getModels());
    return "successful";
}

创建广告:

public class CreateAds {
private String brand;
private ArrayList<String> models = new ArrayList<>();

   public String getBrand() {
        return brand;
   }

   public void setBrand(String brand) {
       this.brand = brand;
   }

   public ArrayList<String> getModels() {
      return models;
   }

   public void setModels(ArrayList<String> models) {
      this.models = models;
   }
}

我发现你的 JSON 对象也是错误的。请参考下面的 JSON 对象。

{
"brand": "Acura",
    "models": [
     "2.2CL",
     "2.3CL",
     "3.0CL",
     "TL",
     "TSX",
     "Vigor",
     "ZDX"
   ]
 }

我使用 POSTMan 并尝试过。这是工作代码。试试看。

【讨论】:

  • 我只想要一个品牌名称,一个基于品牌的型号名称。为此,还需要 arraylist 还是只需要单个字符串?比如,你会买一辆汽车,它是“Acura”品牌和“ZDX”。
  • 如果您想要一个型号名称的品牌,那么为 ArrayList 制作字符串就可以了。但是您还需要更改 JSON 对象。 { "brand" : "Acura", "models" : "Vigor" } 如果您将数组发送到后端,那么后端将如何知道为您提出的特定请求选择哪一个。这样做有意义吗。
  • 好吧,为什么不为品牌工作,虽然它是一个单一的字符串?我只是问问。
  • 我已经告诉过你我分享的代码是工作代码。使用 POSTMan 并检查。我不擅长 UI 开发。如果后端代码与 POSTMan 完美配合,那么您需要调试您的 UI 代码。先试试能不能跑后端代码?
  • 是的,brandmodel 不会发送到控制器和模型类。可以解决这个问题吗?
猜你喜欢
  • 2017-11-28
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
相关资源
最近更新 更多