Java 让Spring使用Jackson在GET端点中转换JSON编码的@RequestParam
这是我在stackoverflow中的第一个问题,所以请温柔一点:) 存在可转换为POST的现有GET端点。 它需要扩展以接受查询参数Java 让Spring使用Jackson在GET端点中转换JSON编码的@RequestParam,java,spring,spring-mvc,jackson,Java,Spring,Spring Mvc,Jackson,这是我在stackoverflow中的第一个问题,所以请温柔一点:) 存在可转换为POST的现有GET端点。 它需要扩展以接受查询参数filterKeys,该参数将包含JSON编码的数据。这种方法并不常见,但一些大型API正在使用它。 工作方法是将查询参数映射到字符串,然后使用控制器方法中的Jackson ObjectMapper反序列化到Java对象。 有没有办法在后台的某个地方应用Jackson反序列化,就像Spring支持的“开箱即用”@RequestBody一样 JSON编码的过滤键的示
filterKeys
,该参数将包含JSON编码的数据。这种方法并不常见,但一些大型API正在使用它。
工作方法是将查询参数映射到字符串,然后使用控制器方法中的Jackson ObjectMapper反序列化到Java对象。
有没有办法在后台的某个地方应用Jackson反序列化,就像Spring支持的“开箱即用”@RequestBody
一样
JSON编码的过滤键的示例如下:
[
{
"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;
}
我试着简单地将filterkeyes
映射到FilterKeyRequest
,这当然不起作用。
当前的解决方案是在控制器方法内进行反序列化:
@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);
}
您的getData()方法应该在@RestController注释类中定义(并且不是@Controller)
@RestController
公共数据控制器{
@GetMapping(“/data”)
public List getData(@RequestParam(required=false)int-someOtherParam,
@RequestParam(required=false)字符串筛选键)抛出BadFilterKeyParameter{
列表过滤器=List.of();
试一试{
filters=objectMapper.readValue(filterKeys,new TypeReference(){});
}捕获(IOE异常){
抛出新的BadFilterKeyParameter(“由于JSON格式错误,无法对filterKeys参数进行编码”);
}
返回someService.getData(someOtherParam,过滤器);
}
}
该方法已在使用@RestController
注释的类中,否则如果没有@ResponseBody
注释,它将无法工作,而我的方法中(故意)缺少该注释。谢谢你的回答,但不幸的是,这与我的问题无关。@RestController
只删除了对@ResponseBody
()的需要,我正在尝试从请求参数反序列化JSON。回复的连续化一直有效。@Raif,对不起,我误解了你的问题。Spring将尝试以非常一般的方式转换请求参数。如果我有一个包含JSON的请求参数,我通常会在controller方法中将其定义为Map。
@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;
}
}
@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);
}
}