springboot系列14,REST(下)

自定义参数返回

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值