简体   繁体   English

How to pass JSON Object and return Object from Spring rest controller

[英]How to pass JSON Object and return Object from Spring rest controller

I have an entity class like below:我有一个实体 class ,如下所示:

 public class InputData {

   byte[] nameBytes;
   InputType inputType;
   InputType outputType;
   String inputName;
   Description desc;
 }

Here is my rest controller:这是我的 rest controller:

   @PostMapping(path = "/submitData", consumes = "application/json")
   public HttpStatus callDataService(@RequestBody Map<String, String> json) {
    Gson gson = new GsonBuilder().create();
    InputData inputData = gson.fromJson(json.get("inputData"), InputData.class);
    Report report = dataService.getReport(inputData);
    //return HttpStatus.OK;
}

I have two questions:我有两个问题:

How can I send the report as well as Http Status back as a response?如何发送报告以及 Http 状态作为响应?

How to send the data to controller?如何将数据发送到 controller?

I have created the following test case:我创建了以下测试用例:

@Test
public void testController() throws JSONException {

    Gson gson = new Gson();

    Description desc = new Description();
    desc.setMinimumValidSize(512);
    
    File file = new File("src/test/resources/sampleDocuments/test_1.pdf");

    byte[] byteArray = { 'P', 'A', 'N', 'K', 'A', 'J' };

    JSONObject inputSample = new JSONObject();
    inputSample.put("nameBytes", byteArray);
    inputSample.put("inputType", ImageType.PDF);
    inputSample.put("outputType", ImageType.TIFF);
    inputSample.put("inputName", "ABCDEF");
    inputSample.put("desc", desc);

    String  result = invokeRest(fileInputSample.toString(),"/submitData", HttpMethod.POST);
    assertEquals("200", result);
}

private String invokeRest(String basicParams, String inputImageType, String 
    outputImageType, String options, String url, HttpMethod httpMethod) {

    String testUrl = "http://localhost:" + port + url;

    Map<String, Object> body = new HashMap<>();
    body.put("fileInput", basicParams);

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);

    HttpEntity<String> entity = new HttpEntity(body, headers);
    String result = "";

    ResponseEntity<String> response = restTemplate.exchange(testUrl, httpMethod, entity, String.class);
    if (response.getStatusCode() == HttpStatus.OK) {
        result = response.getBody();
    } else {
        result = response.getStatusCode().toString();
    }
    return result;
}

When I run this the test case failed and I was able to pin point the issue:当我运行这个测试用例失败时,我能够指出问题:

Expected BEGIN_OBJECT but was STRING at line 1 column 13 path $.desc

So I am guessing I am not sending this values in right way所以我猜我没有以正确的方式发送这些值

For Description POJO is below:描述 POJO 如下:

public class Description {
    private static final int DPI = 300;

    private Ctype c = CType.NONE;
    private ColorType color = DEFAULT_COLOR;
    private int dpi = DPI;
}

public enum CType {
    NONE, GROUPA,GROUPB,GROUPB_B,GROUPD
}


public enum ColorType {
    RGB, GREY;
}

Here is the values that is being send: {"desc":"org.restservice.Description@1213ffbc”, "outputType":"TIFF","inputType":"PDF","nameBytes":"src/test/resources/sampleDocuments/test_16.pdf","inputName":"98111"}这是正在发送的值: {"desc":"org.restservice.Description@1213ffbc", "outputType":"TIFF","inputType":"PDF","nameBytes":"src/test/resources /sampleDocuments/test_16.pdf","inputName":"98111"}

How can I send that as Object if I am sending a Map of <String, String> in body?如果我在正文中发送 <String, String> 的 Map,如何将其发送为 Object? Is there any other way to send that object to controller?有没有其他方法可以将 object 发送到 controller?

To return the status and also the object you can try to do it like this:要返回状态以及 object,您可以尝试这样做:

@PostMapping(path = "/submitData", consumes = "application/json")
   public ResponseEntity<Report> callDataService(@RequestBody Map<String, String> json) {
    Gson gson = new GsonBuilder().create();
    InputData inputData = gson.fromJson(json.get("inputData"), InputData.class);
    Report report = dataService.getReport(inputData);
    return ResponseEntity.ok(report);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM