Java 为什么我的自定义异常没有以JSON格式返回?
我已经将Spring应用程序连接到React前端,在那里我需要显示我的自定义异常。定制异常在Spring中可以完美地工作,但是前端(React)只接收错误代码(417),其他什么都不接收 我已经确定问题在于异常没有以JSON格式返回,因为当我使用Postman时,错误消息会完整显示,但不是JSON格式 我的研究表明,由于我使用@RestController(用于我的主控制器)和@ControllerAdvice(用于我的自定义异常处理程序),它应该以JSON格式返回。我还尝试向特定函数添加一个ResponseBody bean,但这也没有帮助 Controller.javaJava 为什么我的自定义异常没有以JSON格式返回?,java,reactjs,spring,Java,Reactjs,Spring,我已经将Spring应用程序连接到React前端,在那里我需要显示我的自定义异常。定制异常在Spring中可以完美地工作,但是前端(React)只接收错误代码(417),其他什么都不接收 我已经确定问题在于异常没有以JSON格式返回,因为当我使用Postman时,错误消息会完整显示,但不是JSON格式 我的研究表明,由于我使用@RestController(用于我的主控制器)和@ControllerAdvice(用于我的自定义异常处理程序),它应该以JSON格式返回。我还尝试向特定函数添加一个R
package com.chess.controller;
import com.chess.board.*;
import com.chess.gameflow.Game;
import com.chess.gameflow.Move;
import com.chess.gameflow.Player;
import com.chess.gameflow.Status;
import com.chess.models.requests.BoardRequest;
import com.chess.models.requests.PlayerRequest;
import com.chess.models.requests.StatusRequest;
import com.chess.models.responses.MovesResponse;
import com.chess.models.responses.Response;
import com.chess.models.responses.StatusResponse;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@CrossOrigin(origins= "http://localhost:3000", maxAge=7200)
@RestController
@RequestMapping("/game")
public class Controller {
Game game;
Board board = Board.boardConstructor();
@PostMapping("/players")
public List<Response> createPlayer(@RequestBody PlayerRequest request){
game = new Game(request.getName1(), request.getName2());
List<Response> returnValue = board.returnBoard();
Player player1= Game.players[0];
StatusResponse status = new StatusResponse(Status.isActive(), Status.isCheck(), player1);
returnValue.add(status);
return returnValue;
}
@PostMapping
public List<Response> makeMove(@RequestBody BoardRequest boardRequest){
StatusResponse status = Game.run(boardRequest);
List<Response> returnValue = board.returnBoard();
returnValue.add(status);
return returnValue;
}
@PostMapping("/end")
public StatusResponse endGame(@RequestBody StatusRequest statusRequest){
Status.setActive(false);
Board board = Board.boardConstructor();
board.generateBoard();
if (statusRequest.isForfeit()){
StatusResponse statusResponse = new StatusResponse(statusRequest.getPlayerName() + " declares defeat! Game Over!");
return statusResponse;
}
StatusResponse statusResponse = new StatusResponse("We have a draw! Good Game!");
return statusResponse;
}
@GetMapping("/moves")
public MovesResponse displayMoves(){
MovesResponse movesResponse = new MovesResponse(Move.returnMoveMessages());
return movesResponse;
}
}
InvalidMoveException.java
package com.chess.exceptions;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(value = HttpStatus.EXPECTATION_FAILED, reason="Invalid Move")
public class InvalidMoveException extends RuntimeException {
public InvalidMoveException(String msg){ super(msg); }
}
我解决了一半的问题。我没有返回handleExceptionInternal的ResponseEntity,而是将ErrorResponse本身作为Response的子对象,它是我所有常规响应的父对象 现在我的CustomExceptionsHandler.java如下所示-
@RestControllerAdvice
public class CustomExceptionsHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = InvalidMoveException.class)
@ResponseStatus(HttpStatus.EXPECTATION_FAILED)
public ErrorResponse resolveInvalidMove(InvalidMoveException e, WebRequest req) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.EXPECTATION_FAILED.value(),
HttpStatus.EXPECTATION_FAILED.getReasonPhrase(),
e.getMessage(),
req.getDescription(true));
return errorResponse;
}
}
当我使用Postman时,我得到了JSON格式的异常。然而,我的错误
反应没有改变。我仍然只得到状态码,没有其他信息。
Board.js
DataService.makeMove(move)
.then(res => {
//console.log(res.data);
setIsWhite((prev) => !prev);
props.setTheBoard(res.data);
setStatus(res.data[64]);
updateMovesList();
})
.catch(err => {
console.log(err)
console.log(err.errMessage)
console.log(err.message)
console.log(err.status)
console.log(err.errReason)
})
DataService.js
makeMove(move){
return axios.post(`${url}`, move);
}
我一直认为捕捉错误很简单,但显然我遗漏了一些东西
DataService.makeMove(move)
.then(res => {
//console.log(res.data);
setIsWhite((prev) => !prev);
props.setTheBoard(res.data);
setStatus(res.data[64]);
updateMovesList();
})
.catch(err => {
console.log(err)
console.log(err.errMessage)
console.log(err.message)
console.log(err.status)
console.log(err.errReason)
})
makeMove(move){
return axios.post(`${url}`, move);
}