Spring + thymeleaf Validanting整数错误BindingResult和bean名称的普通目标对象都不可用作请求属性

时间:2017-09-15 09:20:13

标签: spring thymeleaf

我正在学习春天和百里香,并参与一个计时项目。 为此,我需要验证员工在一天内计时的小时数。

我使用了tutorial in the spring documentation但是我一直收到以下错误

  @RequestMapping(value="Timetable/AddToTimetable", method = RequestMethod.GET)
public String newUser(Model md) {
    md.addAttribute("assignments", serv.findAll());
    return "AddToTimetable";
}

@RequestMapping(value = "/createEntry", method = RequestMethod.POST)
public String create(@RequestParam("assignmentId") int assignmentId,
                     @RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") Date date,
                     @RequestParam("hoursWorked") int hoursWorked,
                     @Valid Timetable timetable, BindingResult bindingResult,
                     Model md) {
    timetable = new Timetable();
    timetable.setAssignmentId(assignmentId);
    timetable.setDate(date);
    timetable.setHoursWorked(hoursWorked);
    md.addAttribute("timetables", service.timetableAdd(timetable));
 if (bindingResult.hasErrors()) {
        return "AddToTimetable";
    }
    return "redirect:/Timetable";
}

任何想法我可能做错了什么?

控制器类

public BigInteger timetableAdd(Timetable timetable){
    KeyHolder keyHolder = new GeneratedKeyHolder();
    String sql = "INSERT INTO timetables ( assignmentId, date, hoursWorked) VALUES ( ?, ?, ?)";
    template.update(new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
            PreparedStatement pst = con.prepareStatement(sql, new String[] {"id"});

            pst.setInt(1, timetable.getAssignmentId());
            pst.setDate(2, new java.sql.Date(timetable.getDate().getTime()));
            pst.setInt(3, timetable.getHoursWorked());
            return pst;
        }
    }, keyHolder);
    return (BigInteger) keyHolder.getKey();
}
}

服务类

package ro.database.jdbcPontaj.model;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;

public class Timetable {

private int timetableId;
private int assignmentId;
private Date date;
private String project;

@NotNull
@Min(0)
@Max(12)
private int hoursWorked;


public int getTimetableId() {
    return timetableId;
}

public void setTimetableId(int timetableId) {
    this.timetableId = timetableId;
}

public int getAssignmentId() {
    return assignmentId;
}

public void setAssignmentId(int assignmentId) {
    this.assignmentId = assignmentId;
}

public Date getDate() {
    return date;
}

public void setDate(Date date) {
    this.date = date;
}

public int getHoursWorked() {
    return hoursWorked;
}

public void setHoursWorked(int hoursWorked) {
    this.hoursWorked = hoursWorked;
}

public String getProject() {
    return project;
}

public void setProject(String project) {
    this.project = project;
}


public Timetable() {
}

public Timetable(int timetableId, String project, Date date, int hoursWorked) {
    this.timetableId = timetableId;
    this.project=project;
    this.date = date;
    this.hoursWorked = hoursWorked;
}

public Timetable(int timetableId, int assignmentId, Date date, int hoursWorked) {
    this.timetableId = timetableId;
    this.assignmentId = assignmentId;
    this.date = date;
    this.hoursWorked = hoursWorked;
}

}

模型类

 <form method="post" name="comment_form" id="comment_form" th:action="@{/createEntry}" th:object="${timetable}" role="form">
                <p> Project</p><br>
                <select name="assignmentId">
                    <option value="" th:each="assignment: ${assignments}" th:value="${assignment.assignmentId}" th:text="${assignment.assignmentId}"></option>
                </select>
                <p>Date</p> <br>
                <input class="datepicker" type="text" name="date"><br>
                <p>Number of hours</p>
                <input type="text" name="hoursWorked" th:field="*{hoursWorked}"><br>
                <p th:if="${#fields.hasErrors('hoursWorked')}" th:errors="*{hoursWorked}">Age Error</p>
                <button type="submit" id="submit" class="btn btn-primary">Submit</button>
            </form>

HTML

        <div class="row">
            <div class="col-md-10 title">
                <h2>Timetable</h2>
            </div>
            <div class="col-md-2">
            </div>
            <div class="col-md-12">

                <table class="table table-bordered">
                    <thead>
                    <tr>
                        <th>id</th>
                        <th>assignment</th>
                        <th>date</th>
                        <th>number of hours</th>
                    </tr>
                    </thead>
                    <tbody>
                    <tr th:each = "timetable: ${timetables}">
                        <td th:text="${timetable.timetableId}">45</td>
                        <td th:text="${timetable.project}">vasi</td>
                        <td th:text="${timetable.date}">1 ian</td>
                        <td th:text="${timetable.hoursWorked}">3000</td>
                    </tr>
                    </tbody>
                </table>

更新:

时间表(跳过bootstrap div)

    @Autowired
JdbcTemplate template;

public List<Timetable> findAll(String loginname) {
    String sql = "  SELECT timetables.timetableId, timetables.assignmentId, timetables.date, " +
            "timetables.hoursWorked, users.username, projects.projectName AS project " +
            "FROM timetables INNER join assignments on timetables.assignmentId = assignments.assignmentId " +
            "INNER JOIN projects on assignments.projectId = projects.projectId " +
            "INNER JOIN users on users.userId = assignments.userId where username= ?";

    RowMapper<Timetable> rm = new RowMapper<Timetable>() {
        @Override
        public Timetable mapRow(ResultSet resultSet, int i) throws SQLException {
            Timetable timetable = new Timetable(resultSet.getInt("timetableId"),
                    resultSet.getString("project"),
                    resultSet.getDate("date"),
                    resultSet.getInt("hoursWorked"));

            return timetable;
        }
    };

    return template.query(sql, rm, loginname);
}

时间表的服务方法

    @RequestMapping(value = {"/Timetable"}, method = RequestMethod.GET)
public String index(Model md){
    org.springframework.security.core.Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    String loginname = auth.getName();
    md.addAttribute("timetables", service.findAll(loginname));
    return "Timetable";
}

时间表的控制器方法

for file in `ls img*.nc` ; do 
  ncks -d lat,17.52,30.98 -d lon,-98.52,-78.02 ${file} -O ${file%???}_cut.nc
done

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你有两个html页面,一个显示所有的分配,一个你输入新的条目。我认为在新的输入页面中出现验证错误时会出现错误。

替换这些行

const handleResponse = (response) => {
  const { person: { user } = {} } = response || {};

  // since user is the value to be used you don't need to set a default unless you need it
  if (user) // do your stuff here
}

有这些

if (bindingResult.hasErrors()) {
   return "AddToTimetable";
}

如果出现错误,您应该转到您尝试输入新条目的页面,而不是转到包含所有作业的页面。