【问题标题】:jOOQ Spring Boot compiling query but not inserting into dbjOOQ Spring Boot编译查询但未插入数据库
【发布时间】:2020-10-08 02:37:36
【问题描述】:

我目前正尝试在我的 springboot 项目中使用 jOOQ 将用户提供的某些数据从 html 表单插入到 MySQL 数据库中。这是我的 MainController,负责从表单中获取数据并通过 VisitorRepository 执行查询:我同时使用 add 和 insertVisitor 方法,但它们都不起作用。

@Controller
public class MainController {

    private final VisitorRepository visitorRepository;

    @Autowired
    public MainController (VisitorRepository visitorRepository) {
        this.visitorRepository = visitorRepository;
    }

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String main() {
        return "main";
    }

    @ResponseBody
    @PostMapping("/")
    public Phonenum firstSubmit(Phonenum phonenum){
        System.out.println(phonenum.getPhonenumber());
        visitorRepository.insertVisitor(phonenum.getPhonenumber(),"now", phonenum.getName());
        return visitorRepository.add(phonenum);
    }
}

VisitorRepository 接口:

    public interface VisitorRepository {

    public Phonenum add(Phonenum visitor);

    public List<Phonenum> findAll();

    public void  insertVisitor(String phoneNumber, String submitTime, String name);
    }

以及存储库实现:

@Repository
@Transactional
public class VisitorRepo implements VisitorRepository{


private final DSLContext dslContext;


public VisitorRepo(DSLContext dslContext){
    this.dslContext = dslContext;
}


public void insertVisitor(String phoneNumber, String submitTime, String name){
    this.dslContext
            .insertInto(Phonenum.PHONENUM)
            .columns(Phonenum.PHONENUM.PHONENUMBER, Phonenum.PHONENUM.SUBMITTIME, Phonenum.PHONENUM.NAME)
            .values(phoneNumber, submitTime, name);

}


public com.demo.visitorlog.model.Phonenum add(com.demo.visitorlog.model.Phonenum visitor) {
    this.dslContext
            .insertInto(Phonenum.PHONENUM)
            .columns(Phonenum.PHONENUM.PHONENUMBER, Phonenum.PHONENUM.SUBMITTIME, Phonenum.PHONENUM.NAME)
            .values(visitor.getPhonenumber(), String.valueOf("submit time"), visitor.getName());
    System.out.println("ran");
    return visitor;
}

我不完全确定如何设置配置类,但这是我所拥有的:

@Configuration
public class mainConfig{

    @Autowired
    private DataSource dataSource;

    @Bean
    public DataSourceConnectionProvider connectionProvider() {
        return new DataSourceConnectionProvider
                (new TransactionAwareDataSourceProxy(dataSource));
    }

    @Bean
    public DefaultDSLContext dsl() {
        return new DefaultDSLContext(configuration());
    }

    public DefaultConfiguration configuration() {
        DefaultConfiguration jooqConfiguration = new DefaultConfiguration();
        jooqConfiguration.set(connectionProvider());
        return jooqConfiguration;
    }

所以我在发布请求后得到System.out.println(),但是当我查看我的数据库时,没有插入任何内容。我错过了什么吗?任何形式的帮助将不胜感激:)

【问题讨论】:

    标签: java mysql spring spring-boot jooq


    【解决方案1】:

    您必须调用.execute() 来执行查询

    this.dslContext
                .insertInto(Phonenum.PHONENUM)
                .columns(Phonenum.PHONENUM.PHONENUMBER, Phonenum.PHONENUM.SUBMITTIME, Phonenum.PHONENUM.NAME)
                .values(visitor.getPhonenumber(), String.valueOf("submit time"), visitor.getName())
                .execute();
    

    【讨论】:

    • 我调用了 .execute() 但它仍然没有将数据添加到数据库中。而是记录了:使用 [SHA1PRNG] 为会话 ID 生成创建 SecureRandom 实例需要 [116] 毫秒。
    • 在提交 type=Forbidden, status=403 的表单后,我也收到 WhiteLabel 页面错误
    • @ph-quiett 在DSLContext 上使用@Autowired
    • @Autowired 在带有参数的单个构造函数的情况下不需要。
    • 你也得到了 403 Forbidden。您是否在端点上配置了任何安全性
    【解决方案2】:

    问题在于 Spring Security 自动启用 csrf 保护,我必须在 Security Config 类中手动禁用:

    @Override
        protected void configure(HttpSecurity http) throws Exception{
            http.cors().and().csrf().disable();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-13
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 2017-01-29
      • 1970-01-01
      相关资源
      最近更新 更多