英文:
Spring Boot - throw exception or indicate item is not found
问题
我写了两个方法,findById
在数据库中查找项目,如果未找到该项目,则抛出异常:
public Url findById(final Long id){
return urlRepository.findById(id)
.orElseThrow(() -> new ShortUrlNotFoundException("找不到给定ID的URL"));
}
第二个方法,findByShortUrl
在数据库中查找项目,并使用 JPA
方法 findByShortUrlIs
,如果找到该项目,则返回大小为1的列表;对于给定的 shortUrl,在数据库中永远不应该有多于1个的项目:
public Optional<String> findByShortUrl(final String shortUrl){
List<Url> urlList = urlRepository.findByShortUrlIs(shortUrl);
if(urlList.isEmpty()){
return Optional.empty();
}
else {
return Optional.of(urlList.get(0).getLongUrl());
}
}
我喜欢在项目未找到时使用 ShortUrlNotFoundException
的模式。那么,是否应该在 findByShortUrl
中也使用它?这样,findByShortUrl
变成了:
public Optional<String> findByShortUrl(final String shortUrl){
List<Url> urlList = urlRepository.findByShortUrlIs(shortUrl);
if(urlList.isEmpty()){
throw new ShortUrlNotFoundException("找不到给定ID的URL");
}
else {
return Optional.of(urlList.get(0).getLongUrl());
}
}
英文:
I've written two methods, findById
searches for an item in the DB and throws an exception if the item is not found :
public Url findById(final Long id){
return urlRepository.findById(id)
.orElseThrow(() -> new ShortUrlNotFoundException("URL not found for the given ID"));
}
The second method, findByShortUrl
searches for an item in the DB and uses the JPA
method findByShortUrlIs
which returns a List of size 1 if the item is found, there should never be more than 1 item in the DB for a given shortUrl :
public Optional<String> findByShortUrl(final String shortUrl){
List<Url> urlList = urlRepository.findByShortUrlIs(shortUrl);
if(urlList.isEmpty()){
return Optional.empty();
}
else {
return Optional.of(urlList.get(0).getLongUrl());
}
}
I like the pattern of using a ShortUrlNotFoundException
if an item is not found. Should I use it also in findByShortUrl ? Then, findByShortUrl becomes:
public Optional<String> findByShortUrl(final String shortUrl){
List<Url> urlList = urlRepository.findByShortUrlIs(shortUrl);
if(urlList.isEmpty()){
throw new ShortUrlNotFoundException("URL not found for the given ID")
}
else {
return Optional.of(urlList.get(0).getLongUrl());
}
}
答案1
得分: 1
为什么不使用以下方式的findFirst
:
Optional<Url> findFirstByShortUrlIs(String shortUrl);
然后,您调用:
public Optional<String> findByShortUrl(final String shortUrl){
return urlRepository.findFirstByShortUrlIs(shortUrl)
.map(Url::getLongUrl)
.map(Optional::of)
.orElseThrow(() -> new ShortUrlNotFoundException("找不到给定 ID 的 URL"));
}
英文:
Why not using findFirst
as this:
Optional<Url> findFirstByShortUrlIs(String shortUrl);
and then, you call:
public Optional<String> findByShortUrl(final String shortUrl){
return urlRepository.findFirstByShortUrlIs(shortUrl)
.map(Url::getLongUrl)
.map(Optional::of)
.orElseThrow(() -> new ShortUrlNotFoundException("URL not found for the given ID"));
}
答案2
得分: 1
个人而言,我绝不会在这两种情况下使用异常机制。异常设计用于未被常规业务逻辑覆盖的意外情况。例如,findById 应在仅在数据库中不期望存在该项时抛出异常进行搜索。对于 findByShortUrl 也是同样的情况。据我所理解,在数据库中没有对象是一种正常情况,因此预期应该是结果为空的情况。另一方面,你提到了“数据库中不应该有多于1个项目”,这正是使用异常的完美情况!如果发现返回的结果集中有两个以上的对象,那就抛出异常。
英文:
Personally speaking, I would never use exception mechanism for both cases. Exceptions are designed for unexpected situations that aren't covered by conventional business logic. For example, findById should throw an exception for the search if and only if you do not expect that item in the database. The same story for the findByShortUrl. As far as I understand it's a normal case not to have a object in db, thus it should be expected case to have empty result. On other hand, you've mentioned that "there should never be more than 1 item in the DB", and that's the perfect case for an exception! If you see that return result set has more than 2 objects, so go and thrown an excpetion.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论