私はspring mvcアプリケーションを構築しています。重複(ユーザ名はプライマリキー)エントリを追加して別のユーザ名を選択するように通知する必要があります。spring mvcアプリケーションでデータベースに重複したユーザー名を追加する際に例外を処理する方法
私はユーザー登録オプションを作成中です。すでに存在するユーザー名をユーザーに入力するまではすべて動作します。さて、username列は私のデータベースの主キーなので、それは慎重だった。
私はこれを処理するためのオプションを探しています:
これは、これは私のリポジトリです
create table users(
username varchar(50) not null primary key,
password varchar(50) not null);
私のSQLテーブルです:
@Repository
class UserRepositoryImpl implements UserRepository{
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void addUser(User user) throws MySQLIntegrityConstraintViolationException {
/*language=SQL*/
String SQL_ADD_USER= "INSERT INTO users VALUES (?,?)";
String username = user.getUsername();
String password = user.getPassword();
jdbcTemplate.update(SQL_ADD_USER, username, password);
}
}
、これは私のコントローラの一部です。クラス:
@RequestMapping(value="/register", method = RequestMethod.GET)
public String registerPage(@ModelAttribute("user") User user){return "register";}
@RequestMapping(value="/register", method=RequestMethod.POST)
public String processRegisterUser(@ModelAttribute("user") User user, BindingResult result){
try {
userRepository.addUser(user);
} catch (com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException e) {
//some line of code that would add information to the view that user with given username already exists.
}
return "redirect:/login";
}
私は、重複したエントリを追加する際に発生する例外を処理しようとしました。このため、私はこの句をpublic void addUser(ユーザユーザ)にthrows MySQLIntegrityConstraintViolationException
と置いています。次のステップでは、この例外をpublic String processRegisterUser
メソッドで処理して、指定したユーザー名が占有されていることをユーザーに通知できるようにしたいと考えました。まあ、それは動作しません。私はcom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
を扱うことができない、ビュー内の重複エラーの代わりに警告を追加する時に私が取得:
HTTP Status 500 - Request processing failed; nested exception is org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT INTO users VALUES (?,?)]; Duplicate entry 'user' for key 'PRIMARY'; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'user' for key 'PRIMARY'
type Exception report
message Request processing failed; nested exception is org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT INTO users VALUES (?,?)]; Duplicate entry 'user' for key 'PRIMARY'; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'user' for key 'PRIMARY'
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT INTO users VALUES (?,?)]; Duplicate entry 'user' for key 'PRIMARY'; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'user' for key 'PRIMARY'
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
あなたがコメントしてくださいすべての詳細が必要な場合。
登録フォームを表示するjspページがありますか? – lenach87
です。それはうまく動作します。さて、私はまだ登録フォームにエラーメッセージを表示するためにフィールドを追加しませんでした。しかしそれは問題ではありません。私はテストのためのtry-catchブロックにいくつかのリダクションを入れました – Przemek
私はそれが私のために働く方法を教えてくれますが、私の場合、例外ではなくHibernateの検証を使用しました。私の例を聞きたいのですか、あるいは例外部分に固執したいですか? – lenach87