当前位置: 首页 > 知识库问答 >
问题:

在spring boot应用程序中,当我试图将自定义错误传递给客户端时发生异常

夹谷英奕
2023-03-14

java.lang.IllegalStateException:在提交响应后无法调用senderRror()

如上所述,我在行response.senderror()方法中得到一个错误。我在网上搜索了4天。但我想不出问题所在。这个问题的原因可能是什么?

我有一个自定义异常类。在下面的代码中,catch块成功地捕获了我的自定义异常。但是当我尝试将它发送到客户端时,它返回上面提到的异常。

我已经尝试了解决方案1-控制器级别@ExceptionHandler解决方案2-HandlerExceptionResolver解决方案3-@ControllerAdvice解决方案4-ResponseStatusException

解决上述问题的方法。但不是为我工作的:(

我已经将错误代码和错误消息添加到响应正文中。然后我就可以成功地得到错误。但那不是我想要的方式。

@RequestMapping(value="/getMemberID/", method=RequestMethod.POST ,headers ="Accept=application/json")
public  ResponseMemberID getMemberID(@RequestBody RequestMemberID request,HttpServletResponse response, @Context HttpServletRequest _request ) throws Exception {

    Member_info memberinfo = new Member_info();
    ResponseMemberID _response =new ResponseMemberID();

    try {
          memberinfo = memberinfoservice.getMemberID(request.getPin(),request.getMsisdn());
          _response.setMember_id(memberinfo.getMember_id()); 

    }catch(MemberNotFoundException exp) {

                 response.sendError(exp.getErrorCode(), exp.getErrorMessage());
    } 

    return _response;
}

我需要使用上面的sendError()方法获得错误代码和错误消息作为JSON响应。异常成功地来到catch块。

共有2个答案

薛弘阔
2023-03-14
@RestController
@CrossOrigin(origins = "*")
public class MemberController {

@Autowired
MemberInfoService memberinfoservice;


@RequestMapping(value="/getMemberID/", method=RequestMethod.POST ,headers = "Accept=application/json")
public ResponseMemberID getMemberID(@RequestBody RequestMemberID request) throws  Exception{

    Member_info memberinfo = new Member_info();
    ResponseMemberID _response =new ResponseMemberID();

       memberinfo = memberinfoservice.getMemberID(request.getPin(),request.getMsisdn());

       if(memberinfo == null) {

           throw new PINNotValidException();

       }
       _response.setMember_id(memberinfo.getMember_id());

    return _response;

}

@ExceptionHandler(PINNotValidException.class)
public ResponseEntity<ErrorResponse> exceptionHandler(Exception ex) {
    ErrorResponse error = new ErrorResponse();
    error.setErrorCode(PSAExceptionCodes.PIN_VALIDATION_FAIL);
    error.setMessage(ex.getMessage());
    return new ResponseEntity<ErrorResponse>(error, HttpStatus.OK);
}

上面提到的是我根据http://www.jcombat.com/spring/exception-handling-in--restful-web-service链接更改的代码,它满足了我的问题。

此外,我还尝试在我创建的应用程序中使用HttpServletResponse类的senderRror()方法,但它总是返回一个空响应。

但是在创建单独的PinNotValideXCeption.Class、ErrorResponse.Class、PSAException.Class和PSAExceptionCodes.Class时使用@ExceptionHandler作为自定义异常,我可以很容易地解决我的问题。

PinNotValideXception.class

public class PINNotValidException extends PSAException{

private static final long serialVersionUID = 1L;
private static String errorMessage = "Pin Number and Mobile Number mismatch.";
private static int errorCode = PSAExceptionCodes.PIN_VALIDATION_FAIL;

public PINNotValidException() {
    super(errorMessage, errorCode);
 }
}

ErrorResponse.Class

public class ErrorResponse {

    private int errorCode;
    private String message;

    public int getErrorCode() {
        return errorCode;
    }
    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

PSAException.Class

public class PSAException extends Exception {
private static final long serialVersionUID= 100L;

private String errorMessage;
private int errorCode;

public String getErrorMessage() {
    return errorMessage;
}
public int getErrorCode(){
    return errorCode;
}
public PSAException(String errorMessage) {
    super(errorMessage);
    this.errorMessage = errorMessage;
}
public PSAException(String errorMessage, int errorCode) {
    super(errorMessage);
    this.errorMessage = errorMessage;
    this.errorCode=errorCode;
}
public PSAException() {
    super();
}
}

PSAExceptionCodes.Class

public class PSAExceptionCodes {

public static final int PIN_VALIDATION_FAIL = 251;      //Pin and mobile mismatch 
public static final int ACCOUNT_TYPE_NOT_FOUND = 300;     //Account type mismatch
public static final int NO_MEMBER_FOUND = 250;            //Member Not Found
public static final int MEMBER_NOT_REGISTERED = 256;      //Member not registered

}
仉刚洁
2023-03-14

这里,1)需要为自定义异常添加错误处理程序2)错误处理程序会抛出异常

一些有用的链接:处理spring hibernate SQL错误的推荐方法

spring有没有更简单的异常处理技术?

注意:这个方法已经过测试,我正在我的应用程序中使用它。

@RestControllerAdvice
    @RequestMapping(produces = "application/json")
    public class DefaultExceptionHandler extends ResponseEntityExceptionHandler {


       @ExceptionHandler(MemberNotFoundException .class)
        @ResponseStatus(value = HttpStatus.CONFLICT)
        public Map<String, String> handleConstraintViolationException(ConstraintViolationException ex) {
         Map<String, String> response = new HashMap);
        // set your response
        return new ResponseEntity<>(response, ex.getStatus());
       }

    }

GetMemberId,删除TryCatch块。

 类似资料:
  • 有很多关于如何在ASP.NETMVC中设置自定义错误页面的好帖子,但是还没有找到一个描述是否可以传递Exception对象本身的帖子,例如显示异常消息(对于用户错误)。 我已经设置了一个ErrorController,它具有类似NotFound、BadReqest和catch-all错误的操作和视图。我想打印出异常消息(如果存在的话),例如在BadReqest视图中(对于用户错误,我也使用500状

  • 我希望当遇到错误时,用户会收到对其http调用的异常响应。该错误确实被捕获并显示在spring日志中,但不会返回给用户。为什么? 我的方法是: 日志中的错误: 错误处理程序: xception.java 例外回复。JAVA 用户收到403。。我不知道为什么,但我应该接受我的错误,没有任何身体。。 InternalServerExc0019在try/catch之外工作。.

  • 问题内容: 我有一个很大的对象,需要将其传递给客户端脚本中的函数。我尝试使用JSON.stringify,但是这种方法遇到了一些问题- 主要与性能有关。是否可以在ejs中执行类似的操作? 在我的客户端脚本中,我会将这个对象传递给类似这样的函数 当我尝试这个我得到 要么 问题答案: 那是预期的行为。您的模板引擎正在尝试从对象创建一个字符串,该字符串会导致[Object object]。如果您真的想要

  • 假设我有以下代码行, 我的代码为: 现在发生的情况是,当编译器到达}catch(final SQLException se){时,它没有转到它的catch主体,只是脱离了,不知道为什么吗?

  • 问题内容: 我现在开始在JAX-RS中使用新的客户端API库,并且到目前为止真的很喜欢它。但是我发现一件事我不知道。我使用的API具有自定义错误消息格式,例如: 它返回400作为状态代码,但还包含描述性错误消息,以告诉您您做错了什么。 但是,JAX-RS 2.0客户端将400状态重新映射为通用状态,因此我丢失了良好的错误消息。它正确地将其映射到BadRequestException,但带有通用的“