Lah*_*ara 5 java spring spring-boot
我有一个控制器来接收POST请求并返回JSON输出。在控制器类内部实现的异常处理程序工作正常。
我试图添加带@ControllerAdvice注释的全局异常处理,但这在我的解决方案中不起作用。我不认为全局异常处理程序类正在加载。
下面是我的控制器类:
package hello;
@Controller
@RequestMapping("/v1")
public class MyController {
@RequestMapping(value = "/saveEmployee", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public String saveEmployee(@Valid @RequestBody Employee employee) {
return "{ \"name\":\"" + employee.getEmail() + "\"}";
}
}
Run Code Online (Sandbox Code Playgroud)
以下是全局异常处理程序类:
package util;
@ControllerAdvice
public class MyControllerAdvice {
@ExceptionHandler(MethodArgumentNotValidException.class)
// @ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public String processValidationError(MethodArgumentNotValidException ex) {
BindingResult result = ex.getBindingResult();
FieldError fieldError = result.getFieldError();
String code = fieldError.getCode();
String field = fieldError.getField();
String message = fieldError.getDefaultMessage();
message = "{ \"Code\":\"" + code + "\",\"field\":\"" + field + "\",\"Message\":\"" + message + "\"}";
return message;
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我的配置:
package hello;
@SpringBootApplication
public class Application {
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Bean
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
春季启动版本:2.0.3.RELEASE
Dav*_*ave 11
我认为您在这里遇到的问题正是您所确定的。本MyControllerAdvice类没有被加载。从您发布的代码中,我推断您的项目结构如下所示:
src
main
java
hello
Application.java
MyController.java
util
MyControllerAdvice.java
Run Code Online (Sandbox Code Playgroud)
因为您SpringBootApplication的Application类上有注释,所以 Spring Boot 使用它作为创建 bean 的起点,并查找用诸如@Controller和@ControllerAdvice(以及其他)之类的注释的类以添加到其上下文中。
有许多不同的配置方法,但最简单的方法是重新构建它以适应 Spring 在此处的建议:
https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-structuring-your-code.html
该页面很短,值得一读以了解背景,但本质是您希望您的@SpringBootApplication注释类与您希望 Spring 管理的所有类在同一个包或父包中,上面的页面给出了以下示例:
com
+- example
+- myapplication
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
Run Code Online (Sandbox Code Playgroud)
因此,在您的情况下,这意味着要么将util包移动到下hello,例如:
src
main
java
hello
Application.java
MyController.java
util
MyControllerAdvice.java
Run Code Online (Sandbox Code Playgroud)
或者为helloandutil和移动Application到该包创建一个父包,例如:
src
main
java
example
Application.java
hello
MyController.java
util
MyControllerAdvice.java
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2213 次 |
| 最近记录: |