在service層註入mapper時報空指針的解決
在service層註入mapper時報空指針
今天又遇到一個極其刁鉆的問題,廢話不多說先上代碼,測試單元
@RunWith(SpringRunner.class) @SpringBootTest(classes = SpringBoot_Run.class) @ContextConfiguration(locations = { "classpath:mybatis/mappers/RevMapper.xml" }) public class TestTransaction { @Autowired RevMapper remapper; @Test public void testInsert() { ReData data = new ReData(); data.setReTime(new Date()).setSeID("fdewfcdsfdssdfdsf").setSendDate(new Date()); remapper.insertObject(data); }
然後是service代碼
public class ReService { @Autowired private RevMapper reMapper; private Socket socket=null; private BufferedReader br=null; private PrintWriter pw=null; public void recevice() { try { //創建服務器,並開放3081端口 ServerSocket serv
RevMapper 類在測試的時候註入的好好地,為毛在service中就是空,一直空,空空空!!!
網上說的@mapperScan還有@mapper的註解我都加瞭一遍,這是為毛!!!!!
在博覽全部大神的CSDN中,我發現大傢都是抄過來抄過去,小弟佩服!!
解決!!!
因為我在啟動類是這樣寫的
@SpringBootApplication(exclude=DataSourceAutoConfiguration.class) @MapperScan(“cn.yungtay.mapper”) public class SpringBoot_Run { public static void main(String[] args) { SpringApplication.run(SpringBoot_Run.class, args); ReMapper re=new ReMapper(); re.receive; } }
厲害的歐巴們不要噴,我第一反應是這樣的!!
問題出來瞭,當一個對象是new出來的時候,他是不交給spring管理的,所以對象根本註入不進去,null是理所當然的
第二個問題,你想一個方法隨著主啟動類而啟動,你可以這麼幹
@Service public class ReService implements ApplicationRunner{ @Autowired private RevMapper reMapper; private Socket socket=null; 。。。。。。。。。。。。。 @Override public void run(ApplicationArguments args) throws Exception { // TODO Auto-generated method stub 你所需要啟動的方法XXXXXXXX }
感覺自己又智慧瞭一點!
springmvc普通類(非control,service)註入mapper為null
在給項目寫一個定時器的時候,需要用到註入mapper進行數據庫操作,用像serviceimpl裡的註入
@Autowired UserMapper usermapper;
無效,debug後發現usemapper為null,說明沒有註入成功
後看到其他文章知道瞭new出來的thread不在spring的容器中,所以無法註入成功,獲得bean
但是按照他的方法依舊為null,他的想法是主動註入bean,應該是對的。
不過我這個可能有點特殊,於是最後隻能使用終極大法
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); usermapper = (UserMapper) ac.getBean("UserMapper"); usermapper.deleteAllCookies();
不要忘瞭給mapper個名字,例
@Repository(value="UserMapper") public interface UserMapper { public List<User> selectByExample(@Param("username1")String username,@Param("password")String password); public int insertToken(@Param("username1")String username,@Param("token")String token); public String checkToken(String token); public int logout(@Param("username1")String username,@Param("token")String token); public int deleteAllCookies(); }
這個方法主觀上感覺不是很好,先這樣吧!
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 解讀Mapper與Mapper.xml文件之間匹配的問題
- spring boot寫java web和接口
- java實現在普通類中註入service或mapper
- SpringBoot MyBatis簡單快速入門例子
- SpringBoot整合MyBatis超詳細教程