Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Spring boot中默认创建管理员帐户_Spring_Spring Mvc_Spring Boot - Fatal编程技术网

在Spring boot中默认创建管理员帐户

在Spring boot中默认创建管理员帐户,spring,spring-mvc,spring-boot,Spring,Spring Mvc,Spring Boot,我有一个用户实体: User.java @Entity public class user { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @NotNull @NotBlank private String firstname; ... 当我第一次部署应用程序时,它将在我的数据库中创建此表 我的问题:是否有任何方法可以在创建表user时创建名为firstname的管理员用户?实际上显示了一种

我有一个用户实体:

User.java

@Entity
public class user {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotNull
@NotBlank
private String firstname;
...
当我第一次部署应用程序时,它将在我的数据库中创建此表

我的问题:是否有任何方法可以在创建表
user
时创建名为firstname的管理员用户?

实际上显示了一种更好的方法,应该是公认的方法


您可以在
src/main/resources/data.sql中放置类似的内容:

INSERT INTO users (firstname, password, enabled)
SELECT 'admin', 'secret', TRUE
WHERE NOT EXISTS (SELECT * FROM users WHERE firstname='admin');
假设您使用PostgreSQL作为数据库后端

由于我不知道您正在使用的数据库模式,您必须修改此查询以匹配您的模式,但它应该提供基本的想法

我认为您甚至不需要为它添加任何配置,因为Spring将自动获取它,如果它位于正确的目录中,则将其用于数据库初始化

根据,在Spring Boot 2.x中,您必须添加以下配置才能工作:

spring.datasource.initialization-mode=always

我宁愿总是避免使用sql脚本,所以我使用CommandLineRunner接口。 这是一个使用spring数据的示例,它不是工作代码:

@Component    
public class CommandLineAppStartupRunner implements CommandLineRunner {
    @Autowired
    UserRepository userRepository;

    @Override
    public void run(String...args) throws Exception {
        User admin = new user(firstName);
        userRepository.save(admin);
    }
}

在应用程序启动之前,该类将被执行。

是的,您应该在属性文件中添加
spring.datasource.data=data.sql
,并使用您想要的sql语句。您可以提供一个示例@hadij,并在每次启动时尝试再次创建/合并,这听起来是错误的。是的,这听起来是错误的,因为您每次都需要调用create/merge(这是我们不需要的额外电话)您的解决方案可行,但有一个更好的+1作为答案此方法优于普通SQL脚本,因为脚本不知道您的db架构更改,需要手动更改。使用实体,您将能够在编译器时跟踪错误。是的,我同意,这比使用SQL脚本(如果密码为我+1)要好如果是加密或加密的,并且散列逻辑在Java应用程序中,这种方法会变得有点尴尬,因为要插入的密码值未知。有没有办法解决这个问题?