Feign客户端支持可选的请求参数吗?
例如,我有一个端点,但是我没有找到一种使用伪装客户端使param1可选的方法。
@GetMapping(path = "endpoint1")
ResponseEntity request(@RequestParam(name = "param1", required = false, defaultValue = "key") String param1){}
答案 0 :(得分:1)
通过创建自定义的FeignFormatterRegistrar
,我设法在Feign中使用了 Optional 请求参数。
这是代码:
package feignformatters;
import org.springframework.cloud.openfeign.FeignFormatterRegistrar;
import org.springframework.format.FormatterRegistry;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class OptionalFeignFormatterRegistrar implements FeignFormatterRegistrar {
@Override
public void registerFormatters(FormatterRegistry registry) {
registry.addConverter(
Optional.class,
String.class,
optional -> {
if (optional.isPresent())
return optional.get().toString();
else
return "";
});
}
}
以下客户端开始使用项目中加载的上一个组件正常工作:
@FeignClient("book-service")
public interface BookServiceClient {
@GetMapping("/books")
public List<Book> getBooks(
@RequestParam("page") Optional<Integer> pageNum,
@RequestParam("size") Optional<Integer> pageSize,
@RequestParam("reader") Optional<Long> readerId);
}
答案 1 :(得分:0)
由于您使用的是Spring Cloud Feign,所以我发现实现可选参数的最简单方法是使用DTO,并可选地实现构建器模式(Lombok可以使冗长程度降低)。
DTO将使请求中的参数为可选(当为null时),而不是方法签名。方法的可选参数应该几乎是不可能的,但必须是alternatives can be found here。
构建器模式将使初始化参数为可选的(或强制性的)details can be found here。该构建器还可以用于设置默认值。 Lombok details can be found here。 另外,建造者可以手动建造。 Starting at wikipedia。 Some example pure Java code。
代码可能看起来像这样:
@GetMapping(path = "/endpoint1") //Not starting with / does not look ok...
ResponseEntity request(@SpringQueryMap MyDTO);
//MyDTO
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class MyDTO {
private String param1;
private String param2;
private String param3;
}
//when using
request(MyDTO.Builder().build()); //use all defaults
request(MyDTO.Builder().param1("foo").build()); //param1 set, all other defaults
request(MyDTO.Builder().param1("foo").param2("bar").build()); //param1 and param2 set
答案 2 :(得分:0)
您可以使用带有Map<String, String>
的简单@SpringQueryMap
注释,然后可以根据需要传递任意数量的可选/强制性参数。
@GetMapping("/task")
ResponseEntity<List<TaskResponse>> getTasks(@SpringQueryMap Map<String, String> queryParameters);
请确保还要验证传递给地图的参数(如果有的话) 它们不是可选的。
类似这样的东西:
List<TaskResponse> getTasks(@NotBlank final String mandatoryParam1, final String optionalParam2) {
Map<String, String> parameters = new HashMap<>();
parameters.put("mandatoryParam1", mandatoryParam1);
Optional.ofNullable(optionalParam2)
.ifPresent(nonNullParam -> parameters.put("optionalParam2", nonNullParam));
return yourFiegnApiClient.getTasks(parameters).getBody();
}