Używam sprężyny z powrotem z reagującym frontem. Połączenia API są z AXIOS. Teraz w sterowniku sprężystym radzę sobie z wyjątkami i rzuć kolejną na reakcję, aby wyodrębnić wiadomość z (naprawdę potrzebuję tej wiadomości). Ale wszystko, co otrzymuję, jest "żądanie nie powiodło się z kodem statusu 500". Jak mogę uzyskać tę wiadomość? Mój kontroler:

@DeleteMapping("/{id}")
    public ResponseEntity<?> delete(@PathVariable("id") Integer id) throws RuntimeException {
        log.info("Request for delete settings {}", id);
        try{
            Settings settings = settingsService.findById(id);
        settingsService.delete(settings.getId());
        log.info("SUCCESS: {} deleted.", settings.getId());
        return new ResponseEntity<>(settings.getId() + " deleted successfully.", HttpStatus.NO_CONTENT);
        } catch (RuntimeException e) {
            System.out.println("CAUSE Controller: "+e.getCause().getMessage());
            throw new RuntimeException("Error during deletion: " + e.getCause().getMessage());
        }
    }

UstawieniaApiservice.js:

delete(id) {
        return axios.delete(`${BASE_URL}/${id}`, ApiService.getAuthHeader());
    }

Teraz mam komponent "tabeli", którą bardzo ponownie wykorzystuję. I wyślij metodę usunięcia jako rekwizyt z każdego przestrzegania komponentu. Ten jest z komponentu Ustawienia

 <Table
                    ref='table'
                    getTr={this.getTr()}
                    getUrl={this.getUrl(idType)}
                    columns={this.getColumns()}
                    updateSelectedItem={this.updateSelectedItem}
                    deleteItem={this.deleteItem}
                    isSettings={true}
                    showDelete={showDelete}
                    toggleShowDelete={this.toggleShowDelete}
                />

I metodę deleteitem w ustawieniach, które wysyłam, to:

deleteItem = async () => {
        await SettingsApiService.delete(this.state.selectedId);
    };

I w komponencie tabeli usunąłem z takim guzikiem:

<Button
                            variant='primary'
                            onClick={() => {
                                globalProps
                                    .deleteItem()
                                    .then((res) => {
                                        console.log(res);
                                        table.draw();
                                    })
                                    .catch((e) => {
                                        console.log(e);
                                        this.setState({ error: e.message });
                                        this.setState({ showModalBatch: true });
                                    });
                                this.props.toggleShowDelete();
                            }}
                        >
                            Delete
                        </Button>

Chcę e.message być tym, który rzuciłem w kontrolerze. Jak mam to zrobic?

1
goodDuck 26 lipiec 2020, 21:56

1 odpowiedź

Najlepsza odpowiedź
  • Na Axios możesz uzyskać dostęp do treści odpowiedzi błędów w "Error.response.data".
  • Na swoim sprężyna Boot zalecam użycie @Controlleradvice do dostosowania odpowiedź według własnych potrzeb.

Przykład:

@ExceptionHandler(MyCustomException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public MyCustomResponse myCustomException(MyCustomException e) {
 return new MyCustomResponse(e.getStatusCode(), e.getStatusMessage());
}
  • Tak więc śledząc przykład, w swoim kodzie, wrzucisz MyCustomexception, wtedy przechwycisz go w komponencie @Controlleradvice i wrócisz do formatu JSON A MyCustomResponse.

Twoje niestandardowe ciało odpowiedzi będzie wyglądać w ten sposób:

{ statusCode: 1002, statusMessage: "My custom error message" }

Więc teraz wracasz do tego ciała na odpowiedź, możesz uzyskać do niego dostęp w swoim osiosie na "Error.response.data.statusMessage".

Sprawdź, czy na przykładzie kod stanu HTTP (@responsestatus) jest ustawiony na 500, ale można dostosować go do wymagań.

2
Carlos 26 lipiec 2020, 20:56