自定义参数返回
也就是说不使用@ResponseBody来实现传出格式为Properties
首先@RestController是组合注解,里面包含@ResponseBody,所以替换为@Controller
/**
* {@link java.util.Properties} {@link HandlerMethodReturnValueHandler} 实现
*/
public class HaoziPropertiesHandlerMethodReturnValueHandler implements HandlerMethodReturnValueHandler {
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return Properties.class.equals(returnType.getMethod().getReturnType());
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
//强转
Properties properties = (Properties) returnValue;
PropertiesHttpMessageConverter converter = new PropertiesHttpMessageConverter();
ServletWebRequest servletWebRequest = (ServletWebRequest)webRequest;
HttpServletRequest request = servletWebRequest.getRequest();
String contentType = request.getHeader("Content-Type");
MediaType mediaType = MediaType.parseMediaType(contentType);
//获取response对象
HttpServletResponse response = servletWebRequest.getResponse();
HttpOutputMessage message = new ServletServerHttpResponse(response);
//通过PropertiesHttpMessageConverter输出
converter.write(properties , mediaType , message);
//告知mvc已经处理完毕
mavContainer.setRequestHandled(true);
}
}
再将上面配置到WebMvcConfigurer中,上文@RequestBody时说过,类似的,如果写成
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
handlers.add(new HaoziPropertiesHandlerMethodReturnValueHandler());
}
源码,注意注释:
就会出现跟之前一样不调用自定义的问题,所以还是在WebMvcConfigurer的PostConstruct里写
//获取当前RequestMappingHandlerAdapter所有的Handler对象
List<HandlerMethodReturnValueHandler> handlers = this.requestMappingHandlerAdapter.getReturnValueHandlers();
List<HandlerMethodReturnValueHandler> newHandlers = new ArrayList<>(handlers.size() + 1);
newHandlers.add(new HaoziPropertiesHandlerMethodReturnValueHandler());
newHandlers.addAll(handlers);
this.requestMappingHandlerAdapter.setReturnValueHandlers(newHandlers);
启动运行,成功。
CORS
Cross-Origin Resource Sharing,跨域操作。
注解驱动:@CrossOrigin
代码驱动:WebMvcConfigurer#addCorsMappings
Filter组件:CorsFilter
关于跨域操作,主要是指别的服务无法调你自己的服务,那在这里其实有三种解决办法,
一种是在被调用的Mapping上加@CrossOrigin
还有一种是在WebMvcConfigurer中配置:
@Override
public void addCorsMappings(CorsRegistry registry) {
//这里的路径可以是精确的,也可以是模糊的
registry.addMapping("/**");
}
再有一种就是在响应头中加:Access-Control-Allow-Origin:*,从前面可以知道,写handler里。