try/catch循环未触发illegalstateexception上的catch语句

cgh8pdjw  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(554)

我正在编写一个spring引导应用程序,并且有一个唯一的对象,该对象持久化在数据库中,并由以下crud存储库检索:

@Repository
public interface DefaultSurveyRepository extends CrudRepository <DefaultSurvey, UUID> {

    public static final UUID specialId = UUID.fromString("123e4567-e89b-12d3-a456-556642440000");

    default DefaultSurvey findSpecialInstance() {
        return findById(specialId).orElseThrow(() -> new IllegalStateException("No Default Survey Found"));
    }
}

在我的服务类构造函数中,我尝试查找对象的specialinstance,如果失败,我将创建一个新版本。代码如下:

@Service
@Transactional
public class AdminManagement {

    private final DefaultSurveyRepository repo;

    @Autowired
    public AdminManagement(DefaultSurveyRepository repo) {

        //Check if defaultSurvey exists.
        try{
            repo.findSpecialInstance();
        }
        catch(IllegalStateException e){
            repo.save(new DefaultSurvey(UUID.fromString("123e4567-e89b-12d3-a456-556642440000"), "[]"));
        }

        this.repo = Objects.requireNonNull(repo);
    }
.
.
.

问题是,如果对象不存在,它不会捕获illegalstateexception并崩溃。我试过设置断点进行调试,但是在到达断点之前它就崩溃了。也许我没有调试正确,但我不明白为什么它不会工作。感谢您的帮助!

zyfwsgd6

zyfwsgd61#

正如评论中提到的,最好实现commandlinerunner。另一个“简单”选项是将回购的初始化详细信息留在@postconstruct:

private final DefaultSurveyRepository repo;

@Autowired
public AdminManagement(DefaultSurveyRepository repo) {
    this.repo = repo;
}

@PostConstruct
private void postConstruct() {
    try{
        repo.findSpecialInstance();
    } catch(IllegalStateException e){
        repo.save(new DefaultSurvey(UUID.fromString("123e4567-e89b-12d3-a456-556642440000"), "[]"));
}
    this.repo = Objects.requireNonNull(repo);
}

请记住,java ee注解在java9中已被弃用,在java 11中已被删除,因此必须将其添加到maven pom.xml中:

<dependency>   
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

相关问题