项目场景:

​Spring 的 RestTemplate 是一个健壮的、流行的基于 Java 的 Http客户端。​

RestTemplate实现request param参数传送,如果如下所示,直接传一个map对象,调试之后是不会接收到参数的

Map<String,Object> param = new HashMap<String,Object>();
param.put("since",10);
restTemplate.getForObject("https://api.github.com/users" , UserDto.class, param);

所以,正确的用法是使用占位符:

Map<String,Object> param = new HashMap<String,Object>();
param.put("since",10);
restTemplate.getForObject("https://api.github.com/users?since={since}" , UserDto.class, param);

问题描述

但是参数一多,我们每个都写占位符,那不是很麻烦,直接丢一个javabean不可以?直接丢个javabean,或者转为map参数都不能直接传过来

RestTemplate Get请求实现传javabean参数_spring boot


原因分析:

通过查看RestTemplate源码:​ ​org.springframework.web.client.RestTemplate#initUriTemplateHandler​

RestTemplate Get请求实现传javabean参数_spring boot_02


​DefaultUriBuilderFactory​ ​​是RestTemplateURL处理的工厂类,基层接口是​ ​UriTemplateHandler​ ​​,所以可以重新定义一下​ ​UriTemplateHandler​


解决方案:

下面介绍一种方法,可以重写​ ​UriTemplateHandler ​ ​接口,在RestTemplate源码里找到这个接口是对接口参数进行处理的

package com.example.resttemplate.configuration;


import lombok.extern.slf4j.Slf4j;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.DefaultUriBuilderFactory;
import org.springframework.web.util.UriComponentsBuilder;
import org.springframework.web.util.UriTemplateHandler;

import java.net.URI;
import java.util.Map;

@Slf4j
public class RestGetUriTemplateHandler implements UriTemplateHandler {

private UriTemplateHandler uriTemplateHandler = new DefaultUriBuilderFactory();


@Override
public URI expand(String uriTemplate, Map<String, ?> uriVariables) {
// 使用UriComponentsBuilder 构建请求的链接,也是拼参数的方法
UriComponentsBuilder builder = UriComponentsBuilder
.fromHttpUrl(uriTemplate);
for (Map.Entry<String, ?> entry : uriVariables.entrySet()) {
builder.queryParam(entry.getKey(), entry.getValue());
}
String uriString = builder.toUriString();
log.info("uriString:[{}]" , uriString);
return uriTemplateHandler.expand(uriString , uriVariables);
}

@Override
public URI expand(String uriTemplate, Object... uriVariables) {
return uriTemplateHandler.expand(uriTemplate, uriVariables);
}
}

使用Hutool的工具类,转换bean类为map对象,​ ​import cn.hutool.core.bean.BeanUtil;​

restTemplate.setUriTemplateHandler(new RestGetUriTemplateHandler());
Map<String,Object> param = BeanUtil.beanToMap(queryDto);
restTemplate.getForObject("https://api.github.com/users/mojombo", UserDto.class , param);

也可以借助apache-commont的工具类进行转换,​ ​import org.apache.commons.beanutils.BeanUtilsBean;​

Map<String, String> paramMap = BeanUtilsBean.getInstance().describe(bean);

运行之后,可以发现参数带上去了,之后调第三方接口,直接传个javabean就可以,方便很多,也可以对javabean转map的操作进行封装,之后直接调用

RestTemplate Get请求实现传javabean参数_spring_03


bp神经网络训练函数梯度下降 神经网络梯度下降算法

梯度下降法梯度:目标值对所有自变量的导数的向量组成梯度下降算法(Gradient Descent):沿梯度下降的方向求解极小值用来训练或学习训练集上的参数w和b算法过程: 初始化参数为任意值求解梯度▽f更新参数,θ=θ-α▽f,α为学习率(大于0)若达到指定迭代次数或收敛条件,训练结束.否则继续执行第2步为了便于理解,以一元函数为例 要找到一个合适的输入值w,使输出的函数值C(w)最小。先随

assign函数 r语言 r语言is.na函数

一.向量相关函数is.na-判断空值 关键词:空值is.na(x) x:向量> test =c('Hello', 'World',NA, 1, 2, 3) > is.na(test) [1] FALSE FALSE TRUE FALSE FALSE FALSE > test[! is.na(test)] #去除test中NA值 [1] "Hello" "