gpt4 book ai didi

spring - 如何自定义@FeignClient Expander 来转换参数?

转载 作者:行者123 更新时间:2023-12-03 18:35:54 24 4
gpt4 key购买 nike

Feign 默认扩展器转换参数:

final class ToStringExpander implements Expander {

@Override
public String expand(Object value) {
return value.toString();
}
}

我想自定义它以将用户转换为支持 GET 参数,就像这样
@FeignClient("xx")
interface UserService{

@RequestMapping(value="/users",method=GET)
public List<User> findBy(@ModelAttribute User user);
}

userService.findBy(user);

我能做什么?

最佳答案

首先,你必须写一个像 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 来为你的处理器添加扩展器。
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 配置中。
  @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 发送模型参数,例如:
public void saveV10(@JsonArgument("session") Session session);

关于spring - 如何自定义@FeignClient Expander 来转换参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35621062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com