2016-08-30 7 views
3

大学のプロジェクト用の単純なライブラリAPIを作成しています。私は本が付いたデータベースを持っています。それぞれのIDは自分のIDです。私はSpring Bootを使ってサービスを作っています。私はJpaRepository<Book, Long>を拡張するBookRepositoryとサービスの実装を持っています。後でJPA EmptyResultDataAccessException処理

@Service 
public class BookServiceImpl implements BookService{ 

    @Autowired 
    private BookRepository bookRepository; 

    @Async 
    @Override 
    public void delete (Long id){ 
     bookRepository.delete(id); 
    } 
} 

、RESTコントローラが要求を処理します。

@RestController 
public class BookServiceController{ 

    @Autowired 
    private BookService bookService; 

    @RequestMapping(value="books/{id}", method = RequestMethod.DELETE) 
    public ResponseEntity<Book> deleteBook (@PathVariable("id") Long id){ 
     bookService.delete(id); 
     return new ResponseEntity<Book>(HttpStatus.OK); 
    } 
} 

、私は123のIDと、たとえば、データベースにない書籍を削除した場合、私は」 dはEmptyResultDataAccessExceptionをスローします。

私の質問はどこで例外を処理するのですか?そのようにNullPointerExceptionをキャストしないようにするにはどうすればよいですか?

ありがとうございます。

+0

(1)別の「BookService」をリポジトリに重ねる理由はありますか? (2)できるだけフィールドインジェクションへのコンストラクタインジェクションを推奨する。 – chrylis

答えて

1

DELETE操作の場合は、実際にエンティティを返すことはありません。リソースがなくなったことを確認するだけです。 DELETEは冪等であるため(レコードを複数回削除できます)、レコードが存在するかどうかにかかわらず同じステータスコードを返すか、レコードが見つからない場合は404を返します。あなたが状況を示す例外持っ

@DeleteMapping("/books/{id}") 
@ResponseStatus(HttpStatus.NO_CONTENT) // because you deleted it 
public void deleteBook(@PathVariable Long id) { 
    try { 
     bookService.delete(id); // or just use the repository directly 
    } catch (EmptyResultDataAccessException ex) { 
     // either do nothing to return a 204, or 
     throw new NotFoundException(); 
    } 
} 

:あなたはまた、ハンドラメソッド簡素化することができ

@ResponseStatus(HttpStatus.NOT_FOUND) 
public class NotFoundException extends RuntimeException {} 

それはもっともらしいのですが、そのEmptyResultDataAccessExceptionべきすでにNOT_FOUNDのステータスで注釈を付けること。これは潜在的な拡張要求です。

+0

私はこれを試して、とにかくEmptyResultDataAccessExceptionを返します。 – Flopn