springboot系列14,REST(下)

北慕城南 提交于 2020-02-19 04:23:53

自定义参数返回

也就是说不使用@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里。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!