最初は自分のプロジェクトで 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 にアップグレードすると、例外として動作しなくなります。
_linksはlinksとしてレンダリングされ、コンテンツ タイプはデバッグ情報の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クラスで機能しないのはなぜですか?
この問題の簡単な回避策はありますか?