Post Java Spring 中的方法和字符串值

Post method and String value in Java Spring

我正在尝试 post 来自 home.html 模板的文本

   <form th:action="@{/process_addText}" th:object="${textzz}" method="post"  >
        
        <input type="text"  th:field="*{text}"  />
    
        <button type="submit" class="btn btn-info">Add</button>
    </form>

这是我的控制器

@PostMapping("/process_addText")
public String processAddText(Text text1) {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    String name = auth.getName();
    User myUser=userRepo.findByEmail(name);
    text1.setUser(myUser);
    textRepo.save(text1);

    return "redirect:/home";
}


@GetMapping("/home")
public String mySuccess(Model model) {
    model.addAttribute("textzz",new Text());
    LOGGER.info("verif==="+model.toString());
    return "home";
}

这是我的文字 class:

@Entity
@Table(name = "texts")

public class Text {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idText;

    @OneToOne
    @JoinColumn(name = "id", referencedColumnName = "id")
    private User user;

    private String text;
}

当我尝试 post 来自 home.html 的“文本”值时,出现此错误:

WARN 680 --- [nio-8088-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'com.myblog.app.model.Text'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.lang.Long] for value 'qvefd'; nested exception is java.lang.NumberFormatException: For input string: "qvefd"]

我不知道为什么会收到这个,因为类型是正确的

更新:当我删除输入并在我的数据库中 post(无文本)时,我得到正确的行(对于文本 ID 和用户的外键),当然文本值 = NULL。所以问题可能出在输入类型上。

您的控制器方法接受 Text 实体,但您的前端表单发送 post 请求,在请求正文中仅发送一个简单的 String

然后 Spring 无法将 String 转换为 Text 对象。

所以你的控制器方法应该是

@PostMapping("/process_addText")
public String processAddText(String text) {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    String name = auth.getName();
    User myUser=userRepo.findByEmail(name);

    Text text1 = textRepo.findByUser(myUser);
    if (text1 == null){
       text1 = new Text();
       text1.setUser(myUser);
    }
    text1.setText(text);
    textRepo.save(text1);

    return "redirect:/home";
}