EnableWebMvcConfiguration
public static class EnableWebMvcConfiguration {
private final WebMvcRegistrations mvcRegistrations;
public EnableWebMvcConfiguration(ObjectProvider<WebMvcRegistrations> mvcRegistrationsProvider) {
this.mvcRegistrations = mvcRegistrationsProvider.getIfUnique();
}
@Override
protected RequestMappingHandlerAdapter createRequestMappingHandlerAdapter() {
// 如果自定义了WebMvcRegistrations,则使用自定义的,其他的默认配置行为不变
if (this.mvcRegistrations != null) {
RequestMappingHandlerAdapter adapter = this.mvcRegistrations.getRequestMappingHandlerAdapter();
if (adapter != null) {
return adapter;
}
}
return super.createRequestMappingHandlerAdapter();
}
}
如果你想要完全控制Spring MVC,你可以添加你自己的@Configuration注解@EnableWebMvc,或者自定义配置类该类继承DelegatingWebMvcConfiguration并使用@Configuration注解。 消息转换HttpMessageConverters
SpringMVC使用HttpMessageConverter接口来转换HTTP请求和响应。明智的默认值是开箱即用的。例如,对象可以自动转换为JSON(通过使用Jackson库)或XML(通过使用JacksonXML扩展(如果可用),或者通过使用JAXB(如果Jackson XML扩展不可用))。默认情况下,字符串以UTF-8编码。
如果需要添加或自定义转换器,可以使用Spring Boot的HttpMessageConverters类,如以下列表所示:
@Configuration(proxyBeanMethods = false)
public class CustomHttpMessageConvertersConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> additional = new AdditionalHttpMessageConverter();
HttpMessageConverter<?> another = new AnotherHttpMessageConverter();
return new HttpMessageConverters(additional, another);
}
}
系统默认也提供了HttpMessageConverters Bean,其实我们可以直接将自定义的HttpMessageConverter注册为Bean即可:
public class HttpMessageConvertersAutoConfiguration {
@Bean
@ConditionalOnMissingBean
// 这里的参数就能够收集所有HttpMessageConverter类型的Bean
public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) {
return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList()));
}
}
自定义JSON序列化和反序列化
如果你使用Jackson来序列化和反序列化JSON数据,你可能需要编写自己的JsonSerializer和JsonDeserializer类。自定义序列化程序通常通过一个模块向Jackson注册,但Spring Boot提供了一个替代的@JsonComponent注释,可以更容易地直接注册Spring Beans。
你可以在JsonSerializer、JsonDeserializer或KeyDeserialize实现上直接使用@JsonComponent注释。您也可以在包含序列化程序/反序列化程序作为内部类的类上使用它,如以下示例所示:
@JsonComponent
public class MyJsonComponent {
public static class Serializer extends JsonSerializer<MyObject> {
@Override
public void serialize(MyObject value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
jgen.writeStartObject();
jgen.writeStringField("name", value.getName());
jgen.writeNumberField("age", value.getAge());
jgen.writeEndObject();
}
}
public static class Deserializer extends JsonDeserializer<MyObject> {
@Override
public MyObject deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectCodec codec = jsonParser.getCodec();
JsonNode tree = codec.readTree(jsonParser);
String name = tree.get("name").textValue();
int age = tree.get("age").intValue();
return new MyObject(name, age);
}
}
}