2015-02-13 5 views
4

Я пытаюсь написать обработчик ошибок в Spring-Boot для моих контроллеров, которые поймают наиболее возможные ошибки (Spring, sql и т. Д.). Пока я могу получить ответ JSON с Nulls, однако я не могу помещать какие-либо данные внутри. Когда я пытаюсь получить сообщение об ошибке, я просто получаю пустую страницу.Spring-Boot - Обработка ошибок

import java.io.IOException; 
import java.sql.SQLException; 

import javax.servlet.http.HttpServletRequest; 

import org.springframework.boot.autoconfigure.web.ErrorController; 
import org.springframework.web.bind.annotation.ExceptionHandler; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 
import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException; 

@RestController 
public class BasicErrorController implements ErrorController { 
    private static final String ERROR_PATH = "/error"; 

    @RequestMapping(value=ERROR_PATH) 
    @ExceptionHandler(value = {NoSuchRequestHandlingMethodException.class, SQLException.class, IOException.class, RuntimeException.class, Exception.class}) 
    public ErrorBody defaultErrorHandler(HttpServletRequest request, Exception e) {  
     ErrorBody eBody = new ErrorBody();   
     eBody.setMessage(e.getCause().getMessage()); 
     return eBody; 
    } 
} 
import lombok.Getter; 
import lombok.Setter; 

@Getter 
@Setter 
public class ErrorBody { 
    private String dateTime; 
    private String exception; 
    private String url; 
    private String message; 
} 
+0

Не знаете, что вы подразумеваете под «неспособным поместить какие-либо данные внутри» - что вы сделали и что вы видели в результате? Вы не нуждаетесь в аннотации '@ ExceptionHandler' в' ErrorController' (но вам нужно реализовать интерфейс, а ваш, похоже, не подходит). Посмотрите, как «BasicErrorController» реализован в Spring Boot для подсказок. –

+0

Возможно, лучше реализовать 'ErrorAttributes' (не' ErrorController'), но это ваш выбор, если вы хотите получить полный контроль. –

+0

Спасибо за ответы. «Невозможно поместить какие-либо данные внутри» я имел в виду, что всякий раз, когда я пытался получить какие-либо данные из-за ошибки, JSON не отображался. Я решил, что сегодня я смог получить данные об ошибках и правильно отправить их как json, используя «запрос HttpServletRequest» и считывая информацию из запроса. – Groth

ответ

4

Yo может сделать что-то вроде этого:

@ControllerAdvice 
    public class ControllerExceptionTranslator { 


    @ExceptionHandler(EntityNotFoundException.class) 
    @ResponseStatus(HttpStatus.NOT_FOUND) 
    @ResponseBody 
    SimpleErrorMessage handleException(EntityNotFoundException exception){ 
     log.debug("Entity Not Found Exception {}",exception.getMessage()); 
     log.trace(exception.getMessage(),exception); 
     return new SimpleErrorMessage("Entity not found","This resource was not found"); 
    } 


    @ExceptionHandler({UsernameNotFoundException.class}) 
    @ResponseStatus(HttpStatus.UNAUTHORIZED) 
    @ResponseBody 
    SimpleErrorMessage handleException(UsernameNotFoundException exception){ 
     log.debug("Username not found {}",exception.getLocalizedMessage()); 
     log.trace(exception.getMessage(),exception); 
     return new SimpleErrorMessage("Unaouthorized"," "); 
    } 


} 
0

Я был в состоянии добраться до данных об ошибках и отправлять их в виде JSON должным образом с помощью «HttpServletRequest запроса» и чтения информации из запроса.

@RequestMapping(value = ERROR_PATH) 
    public ErrorBody defaultErrorHandler(HttpServletRequest request) {....} 
0

Вот это пример @ExceptionHandler (Exception.class)

https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

Вы можете использовать @ControllerAdvice

package demo.controller; 

import org.springframework.web.bind.WebDataBinder; 
import org.springframework.web.bind.annotation.ControllerAdvice; 
import org.springframework.web.bind.annotation.ExceptionHandler; 
import org.springframework.web.bind.annotation.InitBinder; 
import org.springframework.web.bind.annotation.ModelAttribute; 

@ControllerAdvice 
public class ExceptionControllerAdvice { 

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    System.out.println("controller advice: init binder"); 
} 


@ExceptionHandler(Exception.class) 
public String exception(Exception e) { 
    System.out.println("controller advice: exception Handler"); 
    System.out.println(e.getMessage()); 
    return "error"; 
} 

@ModelAttribute 
public void modelAttribute(){ 
    System.out.println("controller advice:model Attribute"); 
} 
} 
Смежные вопросы