spring boot(学习笔记第三课)
- Gson的解析器配置,静态资源解析
>>>学习视频
学习内容:
- Gson的解析器配置
- 静态资源解析
1. Gson解析器
- 首先看看spring boot的默认JSON转换器的效果。
- 定义一个
Entity
类,准备在Controller
里面显示。price
这里使用@JsonIgnore
,表示不希望最后输出到前端,@JsonFormat(pattern = "yyyy-MM-dd")
表示日期属性按照希望的格式来进行格式化。
package com.example.demo.Entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.util.Date;
@Data
public class Book {
private String name;
private String author;
@JsonIgnore
private Float price;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date publicatationDate;
}
Controller
类里面增加一个book
的方法,之后返回book变量。
@GetMapping("/book")
@ResponseBody
public Book book(){
Book book = new Book();
book.setAuthor("finlay");
book.setName("spring boot");
book.setPrice(Float.valueOf(14.5F));
book.setPublicatationDate(new Date());
return book;
}
- 看看测试一下,可以看到按照预想的,
price
没有输出,日期也和定义的相同个数输出了。
- 这里使用了spring boot的默认
json
转换包jackson-bind
,还可以使用Google的Json转换包。
- 首先从maven工程,从
spring-boot-starter-web
去除json
转换包jackson-bind
,并加入google的json处理包gson
。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
对pom.xml加入更新依赖之后,需要重新加载项目。
- 检查下默认的Gson的配置。点击IntelliJ IDEA的右边🔍按钮。查找
GsonHttpMessageConverterConfiguration
。
看看这个类的配置方式。
这里如果缺少GsonHttpMessageConverter
这个Bean
的情况下,会使用默认的GsonHttpMessageConverter
,所以如果想进行配置,就需要提供一个继承GsonHttpMessageConverter
类的Bean,进行override。
@Configuration
public class HttpMessageConverterConfig {
@Bean
public GsonHttpMessageConverter gsonHttpMessageConverter(){
GsonHttpMessageConverter converter
= new GsonHttpMessageConverter();
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setDateFormat("yyyy/MM/dd");
gsonBuilder.excludeFieldsWithModifiers(Modifier.PROTECTED);
converter.setGson(gsonBuilder.create());
return converter;
}
}
显示效果。
日期格式按照重新定义的表示出来了,但是价格price
没有按照预想隐藏。将这个属性设置成protected
。
@Data
public class Book {
private String name;
private String author;
@JsonIgnore
protected Float price; //设置成protected,期待隐藏前端表示
@JsonFormat(pattern = "yyyy-MM-dd")
private Date publicatationDate;
}
再次看看效果。OK!
2. 静态资源解析
- 静态资源默认定义在如下的地方。
public static class Resources {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/" };
maven
工程中spring-boot-hello\demo\src\main\resources
就是一个classpath
,所以下面的路径都是静态资源的路径。
2. 放入图片到
spring-boot-hello\demo\src\main\resources\META-INF\resources
目录。
之后访问,https://localhost:8080/river.png。
3. 自定义策略
- 可以在
application.properties
里面直接定义静态资源的过滤规则和文件夹位置。
spring.mvc.static-path-pattern=/static/**
如果在访问 https://localhost:8080/river.png
,是不能访问的。
访问https://localhost:8080/static/river.png
,是能够继续访问这个静态资源的。
由此可以看出,默认的情况下,静态资源的pattern是spring.mvc.static-path-pattern=/**
,在修改成spring.mvc.static-path-pattern=/static/**
的情况下,必须按照修改后来访问。
静态资源的路径也可以添加。
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/my_static/
加入了这个classpath:/my_static/
,但是本来默认路径还是都会变得无效。
4. 同样可以通过Java代码的方式进行配置。
- 实现
WebMvcConfigurer
之后addResourceHandler
和addResourceLocations
进行自定义的配置。
@Configuration
public class CustomizedWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/java_static/");
}
}
我们依然可以访问http://localhost:8080/static/sunshine.png
。
但是原来的classpath:/static/river.png已经失效了,因为Java的配置覆盖了默认的设置。
- 可以看出
@Configuration
注解,基本上spring boot的配置有两种方式。- 继承spring boot的接口,重写其中的方法。
@Configuration public class CustomizedWebMvcConfigurer implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry){ registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/java_static/"); } }
- 不继承spring boot的接口,但是在方法的注解上写明@Bean,之后返回spring boot的接口实现,或者配置类对象。
@Configuration public class TomcatConfig { @Bean public TomcatServletWebServerFactory tomcatServletWebServerFactory(){ TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory(); tomcatServletWebServerFactory.addAdditionalTomcatConnectors( createTomcatHttpConnector() ); return tomcatServletWebServerFactory; } private Connector createTomcatHttpConnector(){ Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8081); connector.setSecure(false); connector.setRedirectPort(8080); return connector; } }
- 继承spring boot的接口,重写其中的方法。