Исключение происходит, когда я пытаюсь передать пользовательскую ошибку клиенту в приложении весенней загрузки. - PullRequest
0 голосов
/ 28 декабря 2018

java.lang.IllegalStateException: Невозможно вызвать sendError () после подтверждения ответа

Как указано выше, я получаю сообщение об ошибке в строке ответа.sendError () метод.Я искал в Интернете в течение 4 дней.Но я не мог понять проблему.В чем может быть причина этой проблемы?

У меня есть класс исключений.В следующем коде блок catch успешно перехватил мое пользовательское исключение.Но когда я пытаюсь отправить его клиентской стороне, возвращается исключение, упомянутое выше.

Я уже пробовал Решение 1 - Уровень контроллера @ExceptionHandler Решение 2 - HandlerExceptionResolver Решение 3 - @ControllerAdvice Solution 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;
}

Мне нужно получить код ошибки и сообщение об ошибке в виде ответа JSON, используя метод sendError (), описанный выше. Исключение успешно поступает в блок catch.

Ответы [ 2 ]

0 голосов
/ 10 января 2019
@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-spring-restful-web-service, и он удовлетворяет мою проблему.

Кроме того, я также попытался использовать HttpServletResponse Метод класса sendError () в моем приложении, которое я создал, но всегда возвращал пустой ответ.

Но с помощью @ExceptionHandler для настраиваемого исключения при создании отдельного PINNotValidException.class , ErrorResponse.class , PSAException.class и PSAExceptionCodes.class Я мог бы легко решить свою проблему. Ниже упомянуты эти классы соответственно.

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

}
0 голосов
/ 28 декабря 2018

Здесь, 1) Вам необходимо добавить обработчик ошибок для пользовательского исключения 2) И обработчик ошибок будет выдавать исключение

Некоторая полезная ссылка: Рекомендуемый способ устранения ошибок 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 блок.

...