如何自定义@FeignClient Expander转换参数? [英] How to custom @FeignClient Expander to convert param?
本文介绍了如何自定义@FeignClient Expander转换参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
伪装默认扩展器以转换参数:
Feign default expander to convert param:
final class ToStringExpander implements Expander {
@Override
public String expand(Object value) {
return value.toString();
}
}
我想要对其进行自定义,以将用户转换为支持GET
参数,例如
I want custom it to convert user to support GET
param, like this
@FeignClient("xx")
interface UserService{
@RequestMapping(value="/users",method=GET)
public List<User> findBy(@ModelAttribute User user);
}
userService.findBy(user);
我该怎么办?
推荐答案
首先,您必须编写ToJsonExpander
这样的扩展器:
First,you must write a expander like ToJsonExpander
:
public class ToJsonExpander implements Param.Expander {
private static ObjectMapper objectMapper = new ObjectMapper();
public String expand(Object value) {
try {
return objectMapper.writeValueAsString(value);
} catch (JsonProcessingException e) {
throw new ExpanderException(e);
}
}
}
第二,编写一个类似于JsonArgumentParameterProcessor的AnnotatedParameterProcessor
,为您的处理器添加扩展器.
Second, write a AnnotatedParameterProcessor
like JsonArgumentParameterProcessor to add expander for your processor.
public class JsonArgumentParameterProcessor implements AnnotatedParameterProcessor {
private static final Class<JsonArgument> ANNOTATION = JsonArgument.class;
public Class<? extends Annotation> getAnnotationType() {
return ANNOTATION;
}
public boolean processArgument(AnnotatedParameterContext context, Annotation annotation) {
MethodMetadata data = context.getMethodMetadata();
String name = ANNOTATION.cast(annotation).value();
String method = data.template().method();
Util.checkState(Util.emptyToNull(name) != null,
"JsonArgument.value() was empty on parameter %s", context.getParameterIndex());
context.setParameterName(name);
if (method != null && (HttpMethod.POST.matches(method) || HttpMethod.PUT.matches(method) || HttpMethod.DELETE.matches(method))) {
data.formParams().add(name);
} else {
`data.indexToExpanderClass().put(context.getParameterIndex(), ToJsonExpander.class);`
Collection<String> query = context.setTemplateParameter(name, data.template().queries().get(name));
data.template().query(name, query);
}
return true;
}
}
第三,将其添加到Feign配置中.
Third,add it to Feign configuration.
@Bean
public Contract feignContract(){
List<AnnotatedParameterProcessor> processors = new ArrayList<>();
processors.add(new JsonArgumentParameterProcessor());
processors.add(new PathVariableParameterProcessor());
processors.add(new RequestHeaderParameterProcessor());
processors.add(new RequestParamParameterProcessor());
return new SpringMvcContract(processors);
}
现在,您可以使用@JsonArgument
发送模型参数,例如:
Now, you can use @JsonArgument
to send model argument like:
public void saveV10(@JsonArgument("session") Session session);
这篇关于如何自定义@FeignClient Expander转换参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文