thymeleaf错误 - 通过Thymleaf和Netbeans得出两个数字

时间:2017-12-02 03:38:14

标签: java netbeans thymeleaf

我试图通过使用Thymeleaf的表单请求两个数字(第一个和第二个)作为输入,并添加数字并返回答案。代码运行自:    http://localhost:8080/add

我已在此链接上使用该程序: https://spring.io/guides/gs/validating-form-input/

我还使用最新版本的Springboot,目前为1.5.8。

我发现这个简单的任务变得有些复杂(与python相比),持续的错误并没有任何意义。我目前的问题是我收到以下错误,即使在线查看类似帖子后,我也无法解决...

错误: "异常处理模板"添加":执行处理器时出错&org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor'"

根据这些帖子,我已经改变了#长;" to" Long"在我的NumberForm中,并将我的NumberForm.java移到" sec.calculator"下,但没有快乐......

  • 任何帮助都将不胜感激!

这是我的代码:

1)src / main / java

CalculatorController.java:

package sec.calculator;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class CalculatorController {

  @GetMapping("/add")
  public String addForm(Model model) {
     model.addAttribute("add", new NumberForm());
     return "add";
  }

  @PostMapping("/add")
  public String addSubmit(@ModelAttribute NumberForm add) {
     return "result";
  }
}

------------------------------------

CalculatorApplication.java

package sec.calculator;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CalculatorApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(CalculatorApplication.class, args);
    }
}

------------------------------------

NumberForm.java

package sec.calculator;

/ *  *要更改此许可证标题,请在“项目属性”中选择“许可证标题”。  *要更改此模板文件,请选择“工具”|模板  *并在编辑器中打开模板。  * /

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**import javax.validation.constraints.Size;
*/

public class NumberForm {
    @NotNull
    @Min(0)
    private Long first;
    private Long second;

    public Long add_out;

    public Long add_output() {
        return add_out ;
    }

    public void Setfirst(Long first) {
        this.first = first;
    }

    public void Setsecond(Long second) {
        this.second = second;
    }
}   

-----------------------------------

2)src / main / resources / templates

add.html

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project 
Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->

    <html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
            <body>
                <h1>Form</h1>
                    <form action="#" th:action="@{/add}" th:object="${NumberForm}" method="post">
                    <p>First: <input type="text" th:field="*{First}" /></p>
                    <p>Second: <input type="text" th:field="*{Second}" /></p>
                    <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
                </form>
            </body>
    </html>

------------------------------------------

1 个答案:

答案 0 :(得分:0)

欢迎来到SO。

这里有几个问题。特别是,Java非常区分大小写。

  1. 按照convention关注setter,以便Thymeleaf可以 理解它:

    public void setFirst(Long first) {
        this.first = first;
    }
    
    public void setSecond(Long second) {
        this.second = second;
    }
    

    我假设你省略了类似的getter方法。

    更好的是,请参阅Project Lombok - 完全停止疯狂并使用 @Setter@Getter@Data

  2. 在表单中,小写字段名称:

    <p>First: <input type="text" th:field="*{first}" /></p>
    <p>Second: <input type="text" th:field="*{second}" /></p>
    

    我也会远离这些变量名称,因为它们会变得非常混乱。

  3. 同样在您的表单中,您正在使用th:object="${NumberForm}"但是 您将变量命名为add。 Thymeleaf对这个名为NumberForm的变量一无所知。您的变量名为add,类型为NumberForm,但Thymeleaf将需要此变量的名称。

    所以你可以这样做:model.addAttribute("numberForm", new NumberForm());

    th:object="${numberForm}"

    th:object(modelAttribute)使用小写是 约定。

  4. 您实际上需要包含一些代码来对值进行求和。生病 留下那部分给你。