【问题标题】:Unwanted Conversion in Spring bootSpring Boot 中不需要的转换
【发布时间】:2021-05-17 10:20:31
【问题描述】:

我在使用 Spring Data JPA 时遇到了这个奇怪的错误。这是我的实体类...

// imports

@Entity
public class Activity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String activity;

    public Activity() {}

    public Activity(String activity) {
    this.activity = activity;
    }

    // getters and setters
}

而Controller类是……

// imports

@Controller
@RequestMapping("/students/activity")
public class ActivityController {
    @Autowired
    private ActivityService activityService;
    
    @GetMapping("/new-activity") 
    public String displayForm(Model model) {
        model.addAttribute("newActivity", new Activity());
        return "students/activity-form";
    }

    @PostMapping("/save-activity")
    public String saveActivity(Activity activity){

        activityService.save(activity);
        return "redirect:/students/activity/new-activity";
    }

}

我正在使用 thymeleaf 引擎进行查看。这是我的activity-form.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
    <head><title>Activity Form</title></head>
    <body>
        <form action="/students/activity/save-activity" th:object="${newActivity}" method="POST" >
            <label>Activity:</label>
            <input type="text" th:field="*{activity}">
            <button type="submit">Add activity</button>
        </form>
    </body>
</html>

对我来说一切似乎都很好,但是当我提交活动时,它在浏览器和控制台中显示 Bad Request , 400 Error 并显示此错误

Resolved [org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'info.javacafe.studentforumapp.entities.Activity'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.lang.Integer] for value 'activity 1'; nested exception is java.lang.NumberFormatException: For input string: "activity1"]

我认为 spring 试图将我的活动从 String 转换为 Integer,但我不知道为什么会这样。谁能帮我解释一下为什么会这样?

【问题讨论】:

  • 控制器期待您的 Activity 类的 json 表示形式。您正在向它传递纯文本字符串
  • 是的@blurfus 你是对的,但是在我的实体类中,该字段仅用字符串声明,我不知道为什么它试图将其转换为整数。
  • 分享你正在尝试的请求并抛出异常
  • 我正在从我的浏览器请求...
  • 你用的是什么版本?

标签: java spring spring-boot spring-mvc thymeleaf


【解决方案1】:

如果setActivity 具有Integer 参数,则会发生此错误。确保它看起来像这样:

public void setActivity(String activity) {
    this.activity = activity;
}

【讨论】:

    【解决方案2】:

    我认为 spring 正在尝试将您的 activity 文本字段转换为控制器类中的 activity 参数。

    尝试将该名称更改为如下所示的其他名称。

     @PostMapping("/save-activity")
    public String saveActivity(Activity activityObject){
     //Notice that activity parameter is become activityObject 
    

    请尝试告诉我,我现在无法在我的电脑上模拟这个。

    【讨论】:

      【解决方案3】:

      将控制器方法更新为

      @PostMapping("/save-activity")
      public String saveActivity(@ModelAttribute("newActivity") Activity activity){
          activityService.save(activity);
          return "redirect:/students/activity/new-activity";
      }
      

      我认为缺少的模型属性将正确映射表单值。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2019-10-21
      • 2018-07-27
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 2020-03-09
      相关资源
      最近更新 更多