项目场景:
首次接触微服务项目。从Git上拉取代码后,前端采用node.js把前端跑起来,后端找到项目入口的启动类,然后启动后端。
操作步骤
1.右击项目总文件夹,选择新建model;
2.在自己新建的model里边,进行pom配置,以及各种业务开发;
3.开发完毕之后,运行项目,报错springboot报ScannerException:character ‘@‘ that cannot start any token. (Do not use @ for indentation;
4.进行百度,在pom里边添加了相关依赖,还是报错;
5.开始进行修改。
问题描述及解决方案:
1.最初报的错误,是自己新建的模块没有添加到父pom里边,在
<models></models>
里边添加
<module>test</module>
自己的模块,问题并未得到解决;
2.上一步操作仅仅是把模块进行绑定到了整个项目中,还需要和当前项目通过
<dependency>
<groupId>com.example</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
形式进行交互,这一部分是要添加到整个项目的入口的pom里边,其他的模块也需要通过该种方式进行和整个项目交互。
3.以上两步解决了,第一次存在的问题,但是又暴露了新的问题,我的controller下边的类名在整个项目里边是已经存在了的,进行修改名字;
4.报service和mapper等的名字重复,不能都修改吧;
5.以上问题就涉及到了spring的相关注解;
6.还少描述了一步,在进行dependency配置完之后,还需要进行整个项目启动类的配置,因为如果不配置的话,他就扫描不到controller下边的所有类。
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class },scanBasePackages = { "com.example.test" })
spring注解分析:
controller层的:正式开发中,是需要使用@RestController,使用@Controller的话,他调用方法,然后是要返回一个页面的。
mapper层的:正常开发使用的注解应该是@Repository,但是目前名字重复了,为解决这个问题,采用@Repository(“b”),其中的b也是可以随便起的。
service层的:正常注解应该是@Service就行,但由于我的实现类已经在当前项目存在了,为了不想修改名字,我借助注解,来进行解决。
如果当前项目中只有一个impl实现类的话,我只使用@Service注解即可
但如果不止一个,我的第二个就要采用这种方式进行注解实现@Service(“aaaa”)。
这里边的aaa可以自己随便起名。
mapper.xml层的:开头封装的数据库表中的字段,type要写实体类的完整路径,如:com.example.test.entity.SysUser。
再定义一个自己起的完整的名字路径。在定义查询方法的时候,select的resultType对应的是实体类。而resultMap对应的是自己封装好的resultMap的id.
即
<resultMap type="com.example.test.entity.SysUser" id="SysUserResult1">
<id property="userId" column="user_id" />
</resultMap>
<select id="getAll" resultMap="SysUserResult1">
select dept_id
from sys_user
where user_id=#{id};
</select>
关于以上解决方案在注解进行注入时,如何处理
1.mapper层的注解是@Repository(“b”),注入到serviceimpl中时,应该是这样
//@Resource(name = "b")
@Autowired
@Qualifier(value = "b")
SysUserMapper sysUserMapper;
2.serviceimpl注入到controller中时,应该是这样
@Resource(name = "aaaa")
SysUserService sysUserService;
注:我这里的service是分成了接口和实现类,上述service注解是加在impl里边的,接口service类上边不用添加注解了。
涉及到知识点
@RestController和@Controller两者区别
@Controller:访问经过他注解的方法,可以直接通过返回String跳转到jsp等模板页面。
在方法上加@ResponseBody的话,就可以返回实体对象。
@RestController:是@Controller和@ResponseBody的结合体,经过他注解的controller里的所有方法,只能返回String等实体对象。
共同点:表示spring某个类是否可以接受Http请求。