gpt4 book ai didi

java - 让Spring使用Jackson在GET端点中转换JSON编码的@RequestParam

转载 作者:行者123 更新时间:2023-12-01 21:53:46 24 4
gpt4 key购买 nike

这是我在 stackoverflow 上提出的第一个问题,所以请温柔点:)

现有 GET 端点可转换为 POST。它需要扩展以接受包含 JSON 编码数据的查询参数 filterKeys。这种方法不是很常见,但一些大型 API 正在使用它。工作方法是将查询参数映射到字符串,然后使用 Controller 方法中的 Jackson ObjectMapper 反序列化为 Java 对象。有没有什么方法可以在后台的某个地方应用这个 Jackson 反序列化,就像 Spring 对 @RequestBody 开箱即用的支持一样?

JSON 编码的 filterKeys 示例:

[
{
"parameter": "datetime",
"value": {
"type": "INT_RANGE",
"start": 1275782400,
"end": 1571443199
}
},
{
"parameter": "value",
"value": {
"type": "LONG_RANGE",
"start": 100,
"end": 200
}
}
]

Java 对象:

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Getter;

import javax.validation.constraints.NotNull;
import java.util.List;

@Getter
@AllArgsConstructor
@JsonInclude
public class FilterKeyRequest {

@NotNull
private String parameter;
@NotNull
private FilterValue value;

}

我尝试简单地将 filterKeys 映射到 FilterKeyRequest 这当然不起作用。当前的解决方案是在 Controller 方法内进行反序列化:

@GetMapping("/data")
public List<TransferResponse> getData(@RequestParam(required = false) int someOtherParam,
@RequestParam(required = false) String filterKeys) throws BadFilterKeyParameter {

List<FilterKeyRequest> filters = List.of();
try {
filters = objectMapper.readValue(filterKeys, new TypeReference<List<FilterKeyRequest>>() {});
} catch (IOException e) {
throw new BadFilterKeyParameter("The filterKeys parameters couldn't be encoded due do bad JSON format");
}

return someService.getData(someOtherParam, filters);
}

我真的很想在后台某个地方优雅地处理这个问题。以某种方式使用 org.springframework.core.convert.converter.Converter 或 org.springframework.web.method.support.HandlerMethodArgumentResolver 可能是可能的。最好不要显式调用 Jackson 对象映射器。

更新:我找到了一个带有 Converter 的解决方案,但它仍然意味着显式调用 Jackson ObjectMapper,但我可以接受:

@Slf4j
@RequiredArgsConstructor
@Component
public class FilterKeyConverter implements Converter<String, List<FilterKeyRequest>> {

private final ObjectMapper mapper;

@Override
public List<FilterKeyRequest> convert(String source) {
List<FilterKeyRequest> filters = List.of();
try {
filters = mapper.readValue(source, new TypeReference<List<FilterKeyRequest>>() {});
} catch (IOException e) {
log.warn("The parameter couldn't be encoded due do bad JSON encoding");
}
return filters;
}
}

最佳答案

您的 getData() 方法应该在 @RestController 注解的类中定义(而不是 @Controller)

@RestController
public DataController {
@GetMapping("/data")
public List<TransferResponse> getData(@RequestParam(required = false) int someOtherParam,
@RequestParam(required = false) String filterKeys) throws BadFilterKeyParameter {

List<FilterKeyRequest> filters = List.of();
try {
filters = objectMapper.readValue(filterKeys, new TypeReference<List<FilterKeyRequest>>() {});
} catch (IOException e) {
throw new BadFilterKeyParameter("The filterKeys parameters couldn't be encoded due do bad JSON format");
}

return someService.getData(someOtherParam, filters);
}
}

关于java - 让Spring使用Jackson在GET端点中转换JSON编码的@RequestParam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58751395/

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