春ブーツグローバルコントローラのアドバイスは、Springコンテキストにセットされていません

Lahiru Wijesekara:

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

以下は、グローバル例外ハンドラクラスは、次のとおりです。

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

春のブートバージョン:2.0.3.RELEASE

DaveyDaveDave:

私はあなたがここに持っている問題は、あなたが特定され、正確に何だと思います。MyControllerAdviceクラスがロードされていません。あなたが投稿コードから、私はあなたのプロジェクトの構造は以下のようになりますことを推測しています:

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

あなたが持っているのでSpringBootApplication、あなたの上に注釈をApplicationクラス、春ブーツは、豆を作成するための開始点としてそれを使用し、それはのようなもので注釈を付けたクラスを探します@Controllerし、@ControllerAdviceそのコンテキストに追加する(とりわけ)。

あなたが出始めたり、比較的小規模なプロジェクトで作業している場合、それはここに春の勧告に合うように再構築になることが、最も簡単な設定するには、多くの異なる方法があります。

https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-structuring-your-code.html

このページには、非常に短いと価値背景を得るために読んだが、本質はあなたが欲しいということです@SpringBootApplicationあなたは春が管理するすべてのクラスと同じパッケージまたは親パッケージ内の注釈付きクラスを、上記のページには、次の例を示します:

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

または両方の親パッケージを作成helloし、util移動Applicationのように、そのパッケージまで:

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=175538&siteId=1