2017-09-15 8 views
0

私は春と冬眠を学び、計時プロジェクトに取り組んでいます。 これは、従業員が1日に計時する時間数を検証する必要があります。 Spring + thymeleaf Validanting整数エラーBindingResultもBean名のプレーンターゲットオブジェクトもリクエスト属性として利用できません

は、私は、しかし、私は私が間違っているかもしれないもの次のエラー

Neither BindingResult nor plain target object for bean name 'timetable' available as request attribute 

任意のアイデアを得続けるこのためtutorial in the spring documentationを使用しましたか?

Controllerクラス

@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"; 
} 

Serviceクラス

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(); 
} 
} 

Modelクラス

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; 
} 

} 

Htmlの

​​

UPDATE:(ブートストラップdivをスキップ)

時刻表

 <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> 

タイムテーブル

ためのサービスメソッド
@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"; 
} 

答えて

1

ためのコントローラメソッド私が正しくあなたを理解していれば持っているo htmlページには、すべての割り当てと、新しいエントリを入力するページが表示されます。新しいエントリページに検証エラーがあるとエラーが表示されると思います。エラーがある場合には、これらの線

if (bindingResult.hasErrors()) { 
    return "AddToTimetable"; 
} 
これらのものと

if (bindingResult.hasErrors()) { 
    return "newEntry";//replace the newentry with the html page that you enter the new entry 
} 

は、あなたがそのページには、新しいエントリを入力しようとしたページに移動してはならない

代替すべての課題があります。

+0

リダイレクトは問題ではありません。タイムテーブルページはデータベーステーブルにそのすべての内容を照会します。 AddToTimetableは、送信ボタンを使用してデータベースに新しいエントリを追加し、新しいテーブルを含むすべての行を表示するタイムテーブルにリダイレクトします。 AddToTimetableを読み込もうとしたときにエラーが発生しました。フォームタグでは、タイムテーブル(オブジェクト)にBindingResultがありません。スタック上の他の同様の質問が異なる構造を持っていたので、問題を解決する方法がわかりません。 – Adi

+0

@Adi "AddToTimetable"への戻りはフォームに入りますか? "redirect:/ Timetable"はフォームに入りますか? –

+0

AddToTimetableは、新しいエントリを追加するためのフォームです。このエラーのせいで私はそれをテストできなかったので、あなたはアドレスを聞いていません。 タイムテーブルはシンプルなブートストラップテーブルです。アドレスはlocalhost:8080/Timetableです。時刻表を使って営業時間を更新します – Adi

関連する問題