2017-05-14 12 views
1

私のSpring Boot Webアプリケーションには、アップロードされたファイルに関する情報を記録するJPAエンティティMediumがあります。Spring Data Rest JPAエンティティをカスタムコントローラに保存してHAL表現を返します。

私は一般的な操作を処理するための基本的な春データレストリポジトリを持っている:

@RepositoryRestResource(path = "/media") 
public interface MediumRepository extends CrudRepository<Medium, Long> { 
} 

はしかし、私はその後Mediumレコードを作成し、それを返す、HTTPマルチパートアップロードを使用してファイルをアップロードするためにクライアントが必要です応答。応答の構造は、repository.save()と同じでなければなりません。私が理解できないことは、HATEOASメタデータを追加する方法です。明らかに、返されたばかりの場合、

return mediumRepository.save(medium); 

エンティティの基本的なJSON表現であるHATEOASは返されません。私はおそらくPersistentEntityResourceAssemblerを使用すべきであると私はalready learned

だから、私の現在のコントローラのコードは次のとおりです。

@RestController 
@RequestMapping("/upload") 
public class MediaEndpoint { 

    @Autowired 
    private MediumRepository mediumRepository; 

    @RequestMapping(method = POST) 
    public PersistentEntityResource uploadMedium(
      @RequestPart MultipartFile data, 
      PersistentEntityResourceAssembler persistentEntityResourceAssembler) { 

     Medium medium = new Medium(); 
     // setup of the medium instance 
     Medium savedMedium = mediumRepository.save(medium); 
     return persistentEntityResourceAssembler.toResource(savedMedium); 
    } 
} 

しかし、私はpersistentEntityResourceAssemblerは法に注入得ることができない - 私はどのように私はこれを実装することができます

Failed to instantiate [org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.<init>() 

を取得していますか?

答えて

0

Cepr0's answerに続いて、私は@RepositoryRestControllerに私のコントローラを変更しましたが、私はRepositoryRestController sが@ResponseBodyでアノテートされていないとResponseEntityを返す必要があることをfound

Circular view path [upload]: would dispatch back to the current handler URL [/upload] again. 
Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, 
due to default view name generation.) 

例外が発生しましたので、私はに私のコードを変更しました次のようになります。

これにより、HATEOASメタデータを使用した素晴らしいJSON応答が得られます。

また、メソッドまたはコントローラに@ResponseBodyを注釈する方法も同じです。

1

@RestControllerの代わりに@RepositoryRestControllerを使用してください。

+0

これは私に正しい方向に感謝しました。私はいくつかの調整を加えなければならなかった、自分の答えを見て –

関連する問題