Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 让Spring使用Jackson在GET端点中转换JSON编码的@RequestParam_Java_Spring_Spring Mvc_Jackson - Fatal编程技术网

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

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编码的过滤键的示

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

存在可转换为POST的现有GET端点。 它需要扩展以接受查询参数
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);
    }
}