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块。
@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
}
这里,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
,删除Try
和Catch
块。
有很多关于如何在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,但带有通用的“