0

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 は既に存在します」というメッセージを表示するにはどうすればよいですか?

4

3 に答える 3