java - Spring 上下文中未加载 Spring Boot 全局 Controller 建议

标签 java spring spring-boot

我有一个 Controller 来接收 POST 请求并返回 JSON 输出。在 Controller 类中实现的异常处理程序运行良好。

我尝试使用 @ControllerAdvice 注释添加全局异常处理,但这在我的解决方案中不起作用。我不认为正在加载全局异常处理程序类。

下面是我的 Controller 类:

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() + "\"}";
  }
}

下面是全局异常处理类:

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

以下是我的配置:

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

Spring Boot 版本:2.0.3.RELEASE

最佳答案

我认为您在这里遇到的问题正是您所确定的。未加载 MyControllerAdvice 类。根据您发布的代码,我推断您的项目结构类似于:

src
  main
    java
      hello
        Application.java
        MyController.java
      util
        MyControllerAdvice.java

因为你的 Application 类上有 SpringBootApplication 注释,Spring Boot 使用它作为创建 bean 的起点,它会查找用 之类的注释的类code>@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

因此,在您的情况下,这意味着要么将 util 包移动到 hello 下,例如:

src
  main
    java
      hello
        Application.java
        MyController.java
        util
          MyControllerAdvice.java

或者为 helloutil 创建一个父包并将 Application 移动到该包,例如:

src
  main
    java
      example
        Application.java
        hello
          MyController.java
        util
          MyControllerAdvice.java

关于java - Spring 上下文中未加载 Spring Boot 全局 Controller 建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51739509/

相关文章:

java - 我如何使用 spring Autowiring 使用内存中的 derby 数据库来使用一堆 DAO?

java - 如何在JAVA Spring-boot上扩展CAS

java - 如何在 tomcat 7 中为 spring boot 1.2.3 制作可部署的 war 文件

java - axios、Spring boot 和 base64 的问题

java - Cordova Android 5.1.1 中 appView 为 Null

java - 在 Java 中显示 SOAPUI TestRunner 响应

java - 如何测试远程系统是否可达

java - 使用 DCC 下载文件

java - 针对特定属性组同步处理 jms 消息,但在其他组中同时处理 jms 消息

java - Spring 配置 XML 架构 : with or without version?