2016-02-09 4 views
1

Я объявил глобальный обработчик исключений следующим образом:Обработка исключений в Spring MVC не достигли

@ControllerAdvice 
public class GlobalDefaultExceptionHandler { 

    @ExceptionHandler(value = MissingMandatoryPropertyException.class) 
    public @ResponseBody ResponseEntity<String> missingMandatoryPropertyException(HttpServletRequest req, MissingMandatoryPropertyException exception) throws Exception { 
     return new ResponseEntity<String>("Missing mandatory parameter: " + exception.getMessage(), HttpStatus.BAD_REQUEST); 
    } 

} 

MissingMandatoryPropertyException просто расширить RuntimeException и это, как я бросаю исключение из моего весеннего контроллера загрузки:

if (userId == null){ 
     throw new MissingMandatoryPropertyException("userId"); 
    } 

Итак, я ожидаю, что GlobalDefaultExceptionHandler перехватывает исключение, но почему-то это не происходит.

Я написал эту JUnit, чтобы проверить поведение исключения:

@WebAppConfiguration 
@SpringApplicationConfiguration(SpringRunner.class) 
@TestPropertySource(locations="classpath:/config/local/env.config") 
@SuppressWarnings("unused") 
public class ExceptionControllerTest { 

protected static final Logger logger = LoggerFactory.getLogger(ExceptionControllerTest.class); 

protected MockMvc mockPHRMvc; 

@Before 
public void setup() { 
    this.mockPHRMvc = MockMvcBuilders.standaloneSetup(new PhrController()).build(); 
} 

@Test public void testGetPhr_missingUserID() { 

    try {     
     MvcResult result = mockPHRMvc.perform(get("/api/1.0/phr")).andExpect(status().is(HttpStatus.BAD_REQUEST.value())).andReturn();  
    } catch (Exception ex) { 
     logger.error("Exception(): ", ex); 
    } 

} 

} 

Все кажется правильно настроено, но, кажется, что весна ботинки не знает, что должны использовать GlobalDefaultExceptionHandler для исключения. Такая же реализация работала с приложением Spring mvc под tomcat, но не с весенним ботинком.

Обновлено
контроллер @RestController

Любой ключ?

+1

Включен ли 'GlobalDefaultExceptionHandler' в вашу конфигурацию для сканирования компонентов? – zeroflagL

+0

Проблема была с jUnit ... как это было предложено @Orest, это работает сейчас (начиная с весенней загрузки, нормально работает нормально). –

ответ

2

Чтобы проверить это, вы должны добавить ControllerAdvice к mockMvc как:

@Before 
public void setup() { 
    this.mockPHRMvc = MockMvcBuilders.standaloneSetup(new PhrController()).setControllerAdvice(new GlobalDefaultExceptionHandler()).build(); 
} 
2

Предыдущий ответ является правильным .. Если вы не хотите, чтобы определить его в явном виде, то вы можете предоставить базовый пакет в @ControllerAdvice

как это

@ControllerAdvice(basePackages = {"com.XYZ.abc"}) 
Смежные вопросы