4

最初は自分のプロジェクトで Spring Boot 1.2 と Spring Hateoas を使用していましたが、エラー メッセージをカスタマイズする必要がありました。そこで、ネイティブの VndErrors と VndError の代わりにクラスを作成しました。

VndErrors.VndError を拡張するクラスを作成しました。

public class MyError extends VndErrors.VndError{
  //add some my custom fields
}

そして、MyError をラップする別のクラス。

public class ErrorDetails{
    int total;

    @JsonProperty("_embedded")
    Map<String, List<MyError>> errors;

   public ErrorDetails(List<MyError> err){
      this.total=err.size();
      errors.put("errors", err); 
   }
}

すべての例外は@ContrllerAdviceクラスで処理されます。プロジェクトでカスタムJackson2ObjectMapperBuilderを使用して構成ObjectMapperしました。

Spring 1.2 を使用したところ、期待どおりにレンダリングされました。次のように。

{ 
  "total": 1,
  "_embedded":{
     "errors":[
       {
        //feilds,
        _links:{
         "self":""
         }
       }
     ]    
  }
}

しかし、Spring Boot 1.3 にアップグレードすると、例外として動作しなくなります。

_linkslinksとしてレンダリングされ、コンテンツ タイプはデバッグ情報のapplication/jsonです。

ステージ 1:

Listofを使用して単純な pojo を作成しようとしていますがLink、機能しません。

public class ErrorDetails{}//pojo includes fields
public class MyError{
  //add some my custom fields
  @JsonUnwrapped
  ErrorDetails content;

  List<link> links;
}

public class ErrorResources{
    int total;

    @JsonProperty("_embedded")
    Map<String, List<MyError>> errors;

   public ErrorResources(List<MyError> err){
      this.total=err.size();
      errors.put("errors", err); 
   }
}

Spring Hateoas プロジェクトの github で関連する問題をいくつか見つけました。

https://github.com/spring-projects/spring-hateoas/issues/279

https://github.com/spring-projects/spring-hateoas/issues/324

https://github.com/spring-projects/spring-hateoas/issues/288

MyError クラスのリンク@JsonSerialze(using=Jackson2HalModule.HalLinkListSerializer)に追加されたときに、上記の問題の提案の 1 つを試しました。

can't find the correct HttpMessageConverterに似たメッセージを受け取りました。結果のコンテンツ タイプはapplication/ocect(バイナリ) です。

また、デフォルトの contentType またはデフォルトの viewResolver を MappingJackson2JsonView に設定しようとしましたが、結果は変わりませんでした。

私の設定にカスタムを追加したMappingJackson2HttpMessageConverterとき:

  @Bean
  @Order(1)
  public MappingJackson2HttpMessageConverter jacksonMessageConverter() {

    ObjectMapper halObjectMapper=ctx.getBean("_halObjectMapper", ObjectMapper.class);

    MappingJackson2HttpMessageConverter jacksonMessageConverter =
        new MappingJackson2HttpMessageConverter();
    jacksonMessageConverter.setObjectMapper(halObjectMapper);
    jacksonMessageConverter.setSupportedMediaTypes(
        Arrays.asList(MediaTypes.HAL_JSON, MediaType.APPLICATION_JSON_UTF8, MediaType.ALL));

    return jacksonMessageConverter;
  }

エラー結果は期待どおりにレンダリングされます。しかし、私はここで使ったので、それが正しい方法だとは思いませんMediaType.ALL。そして、それは別の大きな問題を引き起こしました。

以前TestRestTemplateは残りの API をテストしていました。restTemlate は、入力データを XML として処理しようとしました。受け入れヘッダーをapplication/json. もちろん、Spring Boot 1.3 スタックにアップグレードする前は機能していました。

ステージ 2:

エラー結果を使用Resourcesしてラップしようとしました。Resource

public class ErrorDetails{}//pojo includes error description fields

public class ErrorResource extends Resource<ErrorDetails>{
}

public class ErrorResources extends Resources<ErrorResource>{
}

public class ErrorMessage {
  int total;
  ErrorResources errors;
}

Spring はまだエラー結果を hal 形式としてレンダリングできません。それは application/json です。クラスを追加 @JsonSerialze(using=Jackson2HalModule.HalResourcesSerializer)すると、デフォルトのコンストラクターがないことErrorResourcesを訴える例外が発生しました。HalResourcesSerializer

@ControllerAdvice クラスで、メソッドの戻り値の型を ErrorMessage と wrapper に設定しようとしましたがResponseEntity、機能しません。

最後に、私の質問は、応答本文を@ControllerAdvice通常のものと同じ@RestControllerようにレンダリングする方法ですか? @ControllerAdviceクラスで機能しないのはなぜですか?

この問題の簡単な回避策はありますか?

4

0 に答える 0