Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的自定义异常没有以JSON格式返回?_Java_Reactjs_Spring - Fatal编程技术网

Java 为什么我的自定义异常没有以JSON格式返回?

Java 为什么我的自定义异常没有以JSON格式返回?,java,reactjs,spring,Java,Reactjs,Spring,我已经将Spring应用程序连接到React前端,在那里我需要显示我的自定义异常。定制异常在Spring中可以完美地工作,但是前端(React)只接收错误代码(417),其他什么都不接收 我已经确定问题在于异常没有以JSON格式返回,因为当我使用Postman时,错误消息会完整显示,但不是JSON格式 我的研究表明,由于我使用@RestController(用于我的主控制器)和@ControllerAdvice(用于我的自定义异常处理程序),它应该以JSON格式返回。我还尝试向特定函数添加一个R

我已经将Spring应用程序连接到React前端,在那里我需要显示我的自定义异常。定制异常在Spring中可以完美地工作,但是前端(React)只接收错误代码(417),其他什么都不接收

我已经确定问题在于异常没有以JSON格式返回,因为当我使用Postman时,错误消息会完整显示,但不是JSON格式

我的研究表明,由于我使用@RestController(用于我的主控制器)和@ControllerAdvice(用于我的自定义异常处理程序),它应该以JSON格式返回。我还尝试向特定函数添加一个ResponseBody bean,但这也没有帮助

Controller.java

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