SpringBoot - 如何从其他类传递异常

时间:2017-12-19 12:39:17

标签: java spring exception-handling

我为REST调用创建了一个相对复杂的SpringBoot-Application,用于在Tds / OpenLdap等中执行不同的操作。 现在我想改进关于异常处理的应用程序。但在这里我有一点问题或理解问题。 例如,我有我的外部类可以从组中删除用户:

@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());  
            }   

确定!因为我想处理不同的目录,我有一个适配器,我可以使用一个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发出Rest-Call,我会收到Code 500:没有消息的内部服务器错误。所以没有人知道它是什么样的错误。在我的控制台中,我得到LdapException,如“[LDAP:错误代码34 - 无效DN]”。这是相关信息。 我怎样才能将这个Ldap-Exception传递给我的SpringApplication。最好的情况是我只传递消息,因为我为SpringApplication定义了不同的Exceptions.classes。这些异常类继承自“异常”

提前谢谢!

1 个答案:

答案 0 :(得分:0)

查看@RestControllerAdvice

创建一个用@RestControllerAdvice注释的新类,如下所示。该类将拦截从控制器引发的异常并使用自定义响应进行包装。此自定义响应正文将包含错误消息以及可选的自定义HTTP响应代码(例如,当SomeExpection出现时为{400} - 如下面的handleSomeException方法所示

@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);
}

}

根据需要,可以为抛出的每种类型的异常添加更多@ExceptionHandler的方法。

您可以ErrorResponse类定义类似下面的内容

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;
}

}

如果您需要进一步的信息/说明,请在评论中说明。

相关问题