Java RESTful Web サービス (Jersey) を使用して Web フォームの送信を行っています。ユーザーが Web フォームを送信すると、送信後に情報が MySQL データベースに保存されます。DB操作にSpring JDBCを使用しています。Web フォームには、id、name、DOB の 3 つのフィールドがあります。ID は DB 内で一意である必要があります。そのため、ユーザーが重複した既存の ID フィールドを送信した場合、フォームはそのままで、「ID は一意である必要があります」という警告が表示されます。ただし、DB 一意制約の例外をコード内のビュー レイヤーに渡す方法がわかりません。私のコードは次のようになります。
public class CustomerJDBCTemplate implements CustomerDAO {
private DataSource dataSource;
private JdbcTemplate jdbcTemplateObject;
public void create(int id, String name, Date dob) {
String sqlStmt = "INSERT INTO Person (id, name, dob) VALUES (?, ?, ?)";
jdbcTemplateObject.update(sqlStmt, new Integer(id), name, dob);
System.out.println("Created Record Name = " + name);
}
// ......
}
私のプレゼンテーション層のコントローラ クラスは次のとおりです。
@Path("/customer")
public class CustomerService {
@Context UriInfo uriInfo;
@Context HttpServletRequest request;
@Context HttpServletResponse response;
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
CustomerJDBCTemplate dbController = (CustomerJDBCTemplate) context.getBean("customerJDBCTemplate");
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("created")
public Response createCustomer(@FormParam("id") int id,
@FormParam("name") String name, @FormParam("dob") Date dob)
throws ServletException, IOException {
URI uri = URI.create(uriInfo.getPath());
Response r;
try {
dbController.create(id, name, dob); //This may throw exception.
request.setAttribute("name", name);
request.setAttribute("dob", dob);
request.setAttribute("id", Integer.valueOf(id));
RequestDispatcher dispatcher = request.getRequestDispatcher("/confirm.jsp");
dispatcher.forward(request, response);
} catch (DataAccessException ex) {
String errMsg = ex.getMessage();
System.out.println(errMsg);
//To do: what should I put here to pass the "id already exists" information to the users?
}
r = Response.created(uri).build();
return r;
}
@GET
@Produces(MediaType.TEXT_HTML)
public Viewable displayForm() {
return new Viewable("/form.html");
}
}
上記のコードでは、入力 ID が DB に既に存在する場合、次の行で例外がスローされる可能性があります。
dbController.create(id, name, dob); //This may throw exception.
では、DB UNIQUE 制約の例外をキャッチして、このエラー情報を Web フォームに表示するにはどうすればよいでしょうか? 私の Web フォームは、送信された情報が正しい場合に送信さform.html
れるフォームです。confirm.jsp
しかし、入力された ID が存在する場合は、Web フォームを現在のページにとどめて、ユーザーにエラー情報を表示させたいと思います。では、DB エラーをビュー レイヤーに伝播するには、何を記述すればよいでしょうか。
アップデート
DB エラーによる例外をキャッチするために、次の行を追加しました。
} catch (DataIntegrityViolationException ex) {
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
}
ただし、これは、ユーザーが [送信] ボタンをクリックした後にのみ、内部サーバー エラー ページに移動します。では、ユーザーが既存の ID を入力したときに、Web フォームをそのままにして、ユーザーに「ID は既に存在します」というメッセージを表示するにはどうすればよいですか?