jfinal操作mysql数据库空指针

jfinal操作mysql数据库空指针异常,希望可以让高手可以帮忙看一下

建表语句

CREATE TABLE url_manager(
id INT PRIMARY KEY AUTO_INCREMENT,
redirectURL VARCHAR(255) NOT NULL
);

pom.xml内容

    <dependency>
      <groupId>com.jfinal</groupId>
      <artifactId>jfinal-undertow</artifactId>
      <version>1.6</version>
    </dependency>

    <dependency>
      <groupId>com.jfinal</groupId>
      <artifactId>jfinal</artifactId>
      <version>4.0</version>
    </dependency>
    <!--桥接器:告诉slf4j使用Log4j2 -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j-impl</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.16.10</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.26</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>0.2.9</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

undertow.txt内容

undertow.devMode=true
undertow.port=80
undertow.host=0.0.0.0
# 绝大部分情况不建议配置 context path
undertow.contextPath=/alit-url-manager
undertow.resourcePath = classpath:alit-url-manager
#jdbc-mysql
jdbc.url=jdbc:mysql://localhost/alit_url_manager
jdbc.user=root
jdbc.pswd=root

启动类代码

package com.alit.url.manager;

import com.alit.url.manager.controller.UrlManagerController;
import com.alit.url.manager.model.UrlManager;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class UrlManagerApplication extends JFinalConfig {
  public static void main(String[] args) {
    long start = System.currentTimeMillis();
    UndertowServer.start(UrlManagerApplication.class, 80, true);
    long end = System.currentTimeMillis();
    System.out.println("启动完成,共使用了" + (end - start) + "ms");
  }

  public void configConstant(Constants me) {
    me.setDevMode(true);
  }

  public void configRoute(Routes me) {
    me.add("/", UrlManagerController.class);
    boolean mappingSuperClass = me.getMappingSuperClass();
    log.info("mappingSuperClass:" + mappingSuperClass);
  }

  public void configEngine(Engine me) {
  }

  public void configPlugin(Plugins me) {
    PropKit.use("undertow.txt");
    String jdbcUrl = PropKit.get("jdbc.url");
    String jdbcUser = PropKit.get("jdbc.user");
    String jdbcPswd = PropKit.get("jdbc.pswd");
    DruidPlugin dp = new DruidPlugin(jdbcUrl, jdbcUser, jdbcPswd);
    dp.start();
    me.add(dp);
    ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
    me.add(arp);
    arp.start();
    arp.addMapping("url_manager", UrlManager.class);

  }

  public void configInterceptor(Interceptors me) {
  }

  public void configHandler(Handlers me) {
  }
}

model类代码

@SuppressWarnings("serial")
public class UrlManager extends Model<UrlManager> {
  // 强烈建议通过 static 修饰过的 dao 对象都要调用一次 dao() 方法,以免新手误用造成线程安全问题
  public static final UrlManager dao = new UrlManager().dao();
}

测试类代码

public class UrlManagerTest {

  private UrlManager urlManager;

  @Before
  public void setUp() throws Exception {
    String[] args = {};
    UrlManagerApplication.main(args);
    urlManager = new UrlManager();
  }

  @Test
  public void save() {
    boolean save = urlManager.set("redirectURL", "http://www.baidu.com").save();
    System.out.println(save);
  }
}

出现的异常

java.lang.NullPointerException
	at com.jfinal.plugin.activerecord.Model.save(Model.java:542)
	at com.alit.url.manager.model.UrlManagerTest.save(UrlManagerTest.java:29)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

出现异常的代码

	public boolean save() {
		filter(FILTER_BY_SAVE);
		
		Config config = _getConfig();
		Table table = _getTable();
		
		StringBuilder sql = new StringBuilder();
		List<Object> paras = new ArrayList<Object>();
		config.dialect.forModelSave(table, attrs, sql, paras); //这里

笔者调试了很长时间,也不知道错误出现了哪里

gitlab https://gitee.com/litongjava_admin/alit-url-manager

评论区

JFinal

2019-06-10 23:01

UrlManagerTest 这个 model 没有映射, 当前映射的是 UrlManager 而不是 UrlManagerTest,注意看代码:
arp.addMapping("url_manager", UrlManager.class);

映射这种事情交给生成器去做,不要手动,下载首页的 jfinal demo for maven ,里头有生成器使用的示例代码,直接用上即可

李通

2019-06-11 10:34

UrlManagerTest 是一个测试类,不是model不需要添加映射.这是我写的一个测试案例,所以是手动添加映射

JFinal

2019-06-11 11:22

@李通 出异常的那个 model 没有被映射,所以会出异常

wozniak

2019-09-20 09:14

@JFinal 我添加了还是保空指针,我再数据库执行SQL都是可以的