如何解决Kotlin JdbcTemplate空
我正在尝试将我的应用程序从Java转换为kotlin,目前正在混合使用Java和Kotlin。我正在尝试先将存储库类转换为Kotlin。这是使用Spring JDBC。我做错什么了吗?
package com.meteor.coral.resources.useradministration.domain
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.jdbc.core.RowMapper
import org.springframework.stereotype.Repository
import java.sql.ResultSet
import java.sql.SQLException
@Repository
open class AppUserJdbcRepository {
@Autowired
private var jdbcTemplate: JdbcTemplate? = null
fun findByFirstName(firstName: String): AppUser {
print("hello")
return jdbcTemplate!!.queryForObject("select firstname,lastname from m_appuser where firstname = ?",arrayOf<Any>(firstName),AppUserRowMapper())
}
internal inner class AppUserRowMapper : RowMapper<AppUser> {
@Throws(SQLException::class)
override fun mapRow(resultSet: ResultSet,i: Int): AppUser {
val appUser = AppUser(resultSet.getString("firstname"),resultSet.getString("lastName") )
return appUser
}
}
}
我的测试仍在Java中
package com.meteor.coral.resources.useradministration;
import com.meteor.coral.UserAdministrationServiceApplication;
import com.meteor.coral.resources.useradministration.domain.AppUser;
import com.meteor.coral.resources.useradministration.domain.AppUserJdbcRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@SpringBootTest(classes = {UserAdministrationServiceApplication.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class AppUserJdbcRepositoryTest {
@Autowired
private AppUserJdbcRepository appUserJdbcRepository;
private static final Logger LOGGER = LoggerFactory.getLogger(AppUserJdbcRepositoryTest.class);
@Test
public void testAppFetch() {
AppUser appUser = appUserJdbcRepository.findByFirstName("CARLO");
LOGGER.info(appUser.getId() + "");
LOGGER.info(appUser.getFirstname());
LOGGER.info(appUser.getLastname());
}
}
jdbctemplate始终为空。
hello
java.lang.NullPointerException
at com.meteor.coral.resources.useradministration.domain.AppUserJdbcRepository.findByFirstName(AppUserJdbcRepository.kt:18)
at com.meteor.coral.resources.useradministration.AppUserJdbcRepositoryTest.testAppFetch(AppUserJdbcRepositoryTest.java:25)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
谢谢
解决方法
在Kotlin中用弹簧注入属性需要lateinit关键字:
@Autowired
private lateinit var jdbcTemplate: JdbcTemplate
通常,您希望进行构造函数注入,因为这可以让您像将其设为val一样删除自动装配的注释:
class AppUserJdbcRepository(private val jdbcTemplate: JdbcTemplate){
为了完整性:您不应该(忽略罕见的极端情况)使用“ !!” Kotlin中的运算符,因为它基本上只是回退到javas的可空性方法。至少以我的经验,使用'?:throw MyCustomException(“ jdbcTemplate在初始化期间为null”)'替换它更具可调试性,我经常发现对它的思考还暴露出不必要的nullability。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。