springboot集成测试
创建控制层
@RestController
public class HelloController {
@RequestMapping("/hello")
public String index(){
return "Hello";
}
}
创建测试类
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class HelloApplicationTests {
@LocalServerPort
private int port;
private URL base;
@Autowired
private TestRestTemplate template;
@BeforeEach //这是Junit5的注解
public void setUp() throws Exception{
this.base = new URL("http://localhost:"+port+"/hello");
}
@Test
public void test1(){
ResponseEntity<String> response= template.getForEntity(base.toString(),String.class);
assertThat(response.getBody(),equalTo("Hello"));
System.out.println("ok");
}
}
解决yml中乱码问题
读取application.yml中的自定义属性
my:
name: cheng
sex: 男
创建代码测试
@Value("${my.name}")
private String name;
@Value("${my.sex}")
private String sex;
@RequestMapping("test")
public String test(){
return name+":"+sex;
}
当属性较多时写一个配置类JavaBean存放属性
application.yml
my:
name: cheng
sex: 男
number: ${random.int}
uuid: ${random.uuid}
#随机生成一个小于10的整数
max: ${random.int(10)}
value: ${random.value}
sayhi: hi,i'm ${my.name}
JavaBean类,@ConfigurationProperties注解表明该类是个配置类
lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
@Data
@Accessors(chain = true) //lombok中链式编程
@ConfigurationProperties(prefix = "my")
@Component
public class ConfigBean {
private String name, sex, uuid, value, sayhi;
private int number, max;
}
@RestController
@EnableConfigurationProperties({ConfigBean.class})
public class HelloController {
@Autowired
ConfigBean configBean;
@RequestMapping(value = "mytest")
public String mytest(){
// ConfigBean configBean = this.configBean.setMax(3).setName("cheng").setSex("nan").setValue("abc"); 体现链式编程
return configBean.getName()+":"+configBean.getSex()+":"+configBean.getMax();
}
}
自定义配置文件
当属性更多时,可以单独写文件,my.properties
com.my.name=cheng
com.my.sex=男
配置类
@Configuration
@PropertySource(value = "classpath:my.properties")
@ConfigurationProperties(prefix = "com.my")
@Data
public class User {
private String name,sex;
}
测试类
@RestController
@EnableConfigurationProperties({ConfigBean.class, User.class})
public class HelloController {
@Autowired
User user;
@RequestMapping("/mytest1")
public String mytest1(){
return user.getName()+user.getSex();
}
}
springboot中多环境的配置
文件配置格式application-{profile}.properties.如:
application-test.properties
application-dev.properties
application-prod.properties
在application.yml中添加spring.profiles.active使用即可,如使用test
spring:
profiles:
active: test
application-test.properties
server.port=8085
java -jar也可以启动程序
java -jar hello-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro
springboot中Actuartor监控
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.properties配置
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.endpoint.shutdown.enabled=true
management.server.port=9000
访问时路径上添加 /actuator前缀才能访问,如 http://localhost:9000/actuator/health
常见端点
SpringBoot整合JPA
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
在mysql数据中创建一个runnoob的数据库,配置properties.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/runoob?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&serverTimezone=GMT%2B8
username: root
password: 123456
jpa:
hibernate:
# 第一次建表时用create,后面用update,每次重启项目会删除对应的数据表并从新创建
ddl-auto: create
# 显示操作sql语句
show-sql: true
创建实体类
@Entity
@Data
@Accessors(chain = true)
public class User {
@Id
// 该注解表明id字段为自增长
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false,unique = true)
private String username;
@Column
private String password;
}
创建dao
@Component //该注解加不加不影响
public interface UserDao extends JpaRepository<User,Long> {
User findByUsername(String username);
}
创建service
@Service
public class UserService {
@Autowired
private UserDao userDao;
public User findUserByName(String username){
return userDao.findByUsername(username);
}
}
创建Controller
@RestController
public class HelloController {
@Autowired
UserService userService;
@GetMapping("user/{username}")
public User getUserName(@PathVariable("username") String name){
return userService.findUserByName(name);
}
}
运行程序:
数据表中插入自己的数据访问即可。
INSERT INTO user (password,username) VALUES("123456","hh");
SpringBoot整合redis
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.yml配置
spring:
redis:
host: localhost
port: 6379
password:
database: 5
创建dao,该类中通过RedisTemplate来访问Redis数据库
@Repository
public class RedisDao {
@Autowired
private StringRedisTemplate redisTemplate;
public void setKey(String key,String value){
ValueOperations<String, String> stringStringValueOperations = redisTemplate.opsForValue();
stringStringValueOperations.set(key,value,1, TimeUnit.MINUTES);//一分钟过期
}
public String getValue(String key){
ValueOperations<String, String> stringStringValueOperations = redisTemplate.opsForValue();
return stringStringValueOperations.get(key);
}
}
测试
@Autowired
private RedisDao redisDao;
@Test
public void test(){
edisDao.setKey("username","cc");
System.out.println(redisDao.getValue("username"));
}
SpringBoot整合Swagger2
添加依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
创建配置类
@Configuration
@EnableSwagger2
public class Swagger2 {
@Bean
public Docket createRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.cc.hello.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("Swagger2文档")
.description("restful风格项目,https://blog.csdn.net/weixin_40911000/article/details/107500798")
.termsOfServiceUrl("https://blog.csdn.net/weixin_40911000/article/details/107500798")
.version("1.0")
.build();
}
}
实体类
@Entity
@Data
@Accessors(chain = true)
public class User {
@Id
// 该注解表明id字段为自增长
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false,unique = true)
private String username;
@Column
private String password;
}
dao层
public interface UserDao extends JpaRepository<User,Long> {
User findByUsername(String username);
}
service层
@Service
public class UserService {
@Autowired
private UserDao userDao;
public User findUserByName(String username){
return userDao.findByUsername(username);
}
public List<User> finAll(){
return userDao.findAll();
}
public User findUserById(Long id){
Optional<User> userOptional=userDao.findById(id);
return userOptional.get();
}
public User saveUser(User user){
return userDao.save(user);
}
public User updateUser(User user){
return userDao.saveAndFlush(user);
}
public void deleteUser(long id){
userDao.deleteById(id);
}
}
controller层
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
UserService userService;
@ApiOperation(value ="所有用户",notes = "查询所有用户")
@RequestMapping(value = "",method = RequestMethod.GET)
public List<User> getUsers(){
List<User> users=userService.finAll();
return users;
}
@ApiOperation(value = "创建用户",notes = "创建用户")
@RequestMapping(value="",method = RequestMethod.POST)
public User postUser(@RequestBody User user){
return userService.saveUser(user);
}
@ApiOperation(value = "查询用户",notes = "根据id查询用户")
@RequestMapping(value="/{id}",method = RequestMethod.GET)
public User getUerById(@PathVariable Long id){
return userService.findUserById(id);
}
@ApiOperation(value = "跟新用户",notes = "根据id更新用户")
@RequestMapping(value="/{id}",method = RequestMethod.PUT)
public User putUser(@PathVariable Long id,@RequestBody User user){
User user1=new User();
user1.setUsername(user.getUsername());
user1.setPassword(user.getPassword());
user1.setId(id);
return userService.updateUser(user1);
}
@ApiOperation(value = "删除用户",notes = "根据id删除用户")
@RequestMapping(value="/{id}",method = RequestMethod.DELETE)
public String deleteUser(@PathVariable Long id){
userService.deleteUser(id);
return "sucess";
}
@ApiIgnore //该注解忽略这个API
@RequestMapping(value="/hello",method = RequestMethod.GET)
public String Hello(){
return "hello!";
}
}
启动项目访问http://localhost:8080/swagger-ui.html
Swagger2文档常用注解
@Api:修饰整个类,用于描述Controller类
@ApiOperation:描述类的方法,或者说一个借口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiProperty:用对象接收参数时,描述对象的一个字段
@ApiRespone:HTTP相应的一个描述
@ApiRespones:HTTP响应的整体描述
@ApiIgnore:使用该注解,表示Swagger2忽略这个API
@ApiError:发生错误返回的信息
@ApiParamImplicit:一个请求参数
@ApiParamsImplicit:多个请求参数