2017-12-19 9 views
0

Tds/OpenLdapなどで異なる操作を実行するためのrelativ複合SpringBoot-Applicationを作成しました。 これで例外処理に関するアプリケーションを改善したいと思います。しかしここで私は少し問題や理解の問題があります。 は例えば、私はグループからユーザーを削除することができ、私の外側のクラスを持っている:SpringBoot - 他のクラスから例外を渡す方法

@ResponseStatus(HttpStatus.OK) 
@RequestMapping(value = "/usergroups", method = RequestMethod.DELETE, consumes = "application/json", produces = "application/json") 
    public void removeUserFromGroup(@RequestBody final LdapGroup LdapGroup) throws Exception{ 
// check input data 
     if(LdapGroup.getUserid().isEmpty()){ 
      logger.warning("The Request-Parameter 'userid:' is missing or empty"); 
      throw new MissingParameter("The Request-Parameter 'userid:' is missing or empty"); 
      } 
// some other checks ...... 

      if (ldapAdapter.doesUserExist(LdapGroup.getUserid()) == false) { 
       logger.warning("Account "+ldapUserGroup.getUserid()+" not exists"); 
       throw new UserAccountDoesNotExistException("Account does not exist"); 
      } 
      boolean isAssigned = ldapAdapter.isUserAssignedToGroup(LdapGroup.getUserid(), LdapGroup.getGroupid(), LdapGroup.getGroupid()); 
      if (isAssigned == false){ 
       logger.warning("User "+LdapGroup.getUserid()+" is not in the group: "+LdapGroup.getGroupid()+ ","+LdapGroup.getGroupOU()); 
      } 
      else{ 
       ldapAdapter.removeUserFromGroupWithOu(LdapGroup.getUserid(), LdapGroup.getGroupid(), LdapGroup.getGroupOU()); 
      } 

OK!私は別のディレクトリを扱いたいので、私は1つのSpringApplicationでそれらを管理できるアダプタを持っています。一つのクラスは、OpenLDAPのためで、グループからユーザーを除去するための方法は、そのようなものです:

@Override 
public void removeUserfromGroup(String groupDN, String userDN) throws LdapException {  
    try {   
     ArrayList<ModificationItem> items = new ArrayList<ModificationItem>(); 
     Attribute userAttribute = new BasicAttribute("uniqueMember", userDN); 
     items.add(new ModificationItem(DirContext.REMOVE_ATTRIBUTE, userAttribute)); 
     doModify(groupDN, items.toArray(new ModificationItem[items.size()]), false); 
     logger.info("User '" + userDN + "' removed from '" + groupDN + "'"); 
    } catch (LdapException e) { 
     throw e;    
    } catch (Exception e) { 
     throw new LdapException(UNEXPECTED_EXCEPTION, e); 
    } 
} 

問題は、私は私のSpringApplicationに残りコールを発射すれば、私はコード500を取得し、今ある:内部サーバーをメッセージなしのエラー。だから、どんな種類のエラーであるかは誰も知らない。私のコンソールでは、 "[LDAP:error code 34 - invalid DN]"のようなLdapExceptionを取得します。これが関連情報です。 このLdap-ExceptionをSpringApplicationにどのように渡すことができますか?最良のケースは、SpringApplication用に異なるExceptions.classesを定義しているため、メッセージを渡すだけです。これらの例外クラスは「例外」から継承します

ありがとうございます!

答えて

0

@RestControllerAdviceをご覧ください。

@RestControllerAdviceと注釈が付けられた新しいクラスを作成します。このクラスは、コントローラから送出される例外を代行受信し、カスタムレスポンスでラップします。このカスタムレスポンスボディは、エラーメッセージを携帯し、カスタムHTTP応答コード(SomeExpectionを上昇さwhenn 例えば400から以下handleSomeException方法に示されるように)任意であろう@ExceptionHandler有する複数のメソッドを追加することができる必要当たりよう

@RestControllerAdvice 
public class ExampleRestControllerAdvice { 

@ExceptionHandler(value = SomeException.class) 
public ResponseEntity<ErrorResponse> handleSomeException(SomeException e) { 

    ErrorResponse response = new ErrorResponse(); 
    response.setErrorMsg(e.getErrorMsg()); 
    response.setErrorCode(e.getErrorCode().getCode()); 

    return new ResponseEntity<ErrorResponse>(response, HttpStatus.BAD_REQUEST); 
} 

@ExceptionHandler(value = Exception.class) 
public ResponseEntity<ErrorResponse> handleException(Exception e) { 

    ErrorResponse response = new ErrorResponse(); 
    response.setErrorMsg("Server error"); 
    response.setErrorCode("ERR007"); 

    return new ResponseEntity<ErrorResponse>(response, 
      HttpStatus.INTERNAL_SERVER_ERROR); 
} 

} 

をスローされたすべての型の例外が発生します。

あなたはさらに情報/明確化が必要な場合

public class ErrorResponse { 

private String errorCode; 
private String errorMsg; 

public String getErrorCode() { 
    return errorCode; 
} 

public void setErrorCode(String errorCode) { 
    this.errorCode = errorCode; 
} 

public String getErrorMsg() { 
    return errorMsg; 
} 

public void setErrorMsg(String errorMsg) { 
    this.errorMsg = errorMsg; 
} 

} 

以下のようなErrorResponseクラス定義された何かがコメントで知らせて持つことができます。

+0

お返事ありがとうございます。私はあなたのアイデアを実装しようとしています。だから、私は理解して、私のSpringApplicationは "@RestControllerAdvice" - アノテーションをカスタムExceptionResponseで作成します。私はその背後にある考え方を理解しています。 私の場合はまったくそうではありません。 OpenLdapControllerとSpring-Rest-Applicationのリンクはどこにありますか? たとえば、ldap "[LDAP:error code 34 - invalid DN]"というエラー応答は私によって生成されたエラーではないためです。私はこのエラーを他のクラスから傍受する必要があります。 – InfoEngi

+0

私が知る限りでは、例外は、Springアプリケーション、つまりコントローラでインターセプトする必要があります。これは '@ RestControllerAdvice'で注釈を付けたクラスが行うものです。私の理解が間違っている場合は、プロジェクトの構造、コントロールフローなどの*より詳細を質問に更新してください。 –

+1

だから、私は今完成したと思うし、私はあなたの提案した構成で何をしたいと思っているすべてを持っていると思います。どうもありがとうございました! ldap([LDAP:error code 34 - 無効なDN])から例外を傍受することはできませんでしたが、以前はコントローラからの例外がありました。それで初めてです。 – InfoEngi

関連する問題