2016-04-03 16 views
1

私は使い方データベース用に作成したRESTfulサービスを持っています。 必須パラメータの開始日は&です。操作可能なパラメータは、ユーザ名、client-ip & remote-ipです。オプションの入力を処理する最良の方法SpringのRESTful API

私はこの作業を持っていますが、実装するためのより良い方法があるかどうかを確認したかった。ここでは

は、私のリソースクラスである:

public List<DTO> getUsageByDate(String startDate, String endDate, String userName, String localIp, String remoteIp) 
     throws BadParameterException { 
    StringBuilder sql = new StringBuilder(
      "select * from usage where process_time >= :start_date and process_time < :end_date"); 

    if(userName != null) { 
     sql.append(" AND user_name = :user_name"); 
    } 
    if(localIp != null) { 
     sql.append(" AND local_ip_address = :local_ip"); 
    } 
    if(remoteIp != null){ 
     sql.append(" AND remote_ip_address = :remote_ip"); 
    } 

    SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("start_date", startDate) 
      .addValue("end_date", endDate).addValue("user_name", userName).addValue("local_ip", localIp) 
      .addValue("nas_ip", remoteIp); 

    try { 
     return jdbcTemplate.query(sql.toString(), namedParameters, 
       new BeanPropertyRowMapper<DTO>(DTO.class)); 

    } catch (EmptyResultDataAccessException e) { 
     throw new BadParameterException(); 
    } 
} 

@RequestMapping(value = "/usage", method = RequestMethod.GET) 
@ApiOperation(value = "Usage Sessions - JSON Body", notes = "GET method for users by date range") 
public List<DTO> getUsageByDate(@RequestParam(value = "start-date", required = true) final String startDate, 
     @RequestParam(value = "end-date", required = true) final String endDate, 
     @RequestParam(value = "user-name", required = false) final String userName, 
     @RequestParam(value = "client-ip", required = false) final String clientIp, 
     @RequestParam(value = "remote-ip", required = false) final String nasIp) throws BadParameterException { 
    return aaaService.findUsageByDate(startDate, endDate, userName, clientIp,remoteIp); 

} 

マイDAOの実装は次のようになります

どんな考えが今でも少し長引いているようです。

おかげ

+0

required = trueがデフォルトです。オプションのパラメーターの場合は、必須属性を追加する必要はありません。 – pczeus

+0

フィードバックいただきありがとうございます。 if文を使った実装にはより良い方法がありますか? – Xathras

+1

私は通常これをJSR303経由で行います。あなたはこのオプションを考えましたか? – dambros

答えて

1
  1. URIの必要なパラメータ(開始日、終了日)の部分を作成して、オプションのパラメータ(ユーザー名、クライアントのIPアドレス、リモートIP)はクエリパラメータを使用するための。だからあなたはURIは/usage/05.05.2015/06.06.2016?user-name=Joeかもしれません。

  2. ユーザー入力の検証は、DAOで実行しないでください。これは、RESTコントローラで実行する必要があります。

  3. は、Java 8使用する場合はオプションであり、getUsageByDateメソッドのシグネチャで必須であるどのパラメータ表現することができます

    public List<DTO> getUsageByDate(String startDate, String endDate, 
         Optional<String> userName, Optional<String> localIp, Optional<String> remoteIp) 
    
  4. ます。また、必要なパラメータが用意されて検証する必要があります:

    Objects.requireNonNull(startDate); 
    Objects.requireNonNull(endDate); 
    
  5. ユーザーが指定した日付が有効であることを確認し、日付をDAOに文字列として渡すことは避けてください。

+0

あなたの(1)は、日付パラメータがオプションであると後で判断する機能を削除します。 –

+0

@EricSteinそれは正しいです。これは、REST APIの表現力とそれを自由に変更する能力との間のトレードオフです。 –

関連する問題