0

I have an entity class like below:

 public class InputData {

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

Here is my 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?

How to send the data to 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:

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"}

How can I send that as Object if I am sending a Map of <String, String> in body? Is there any other way to send that object to controller?

1 Answer 1

1

To return the status and also the object you can try to do it like this:

@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);
}
Sign up to request clarification or add additional context in comments.

5 Comments

Thank you. I am still learning how to use ResponseEntity. This looks good. Do you have any suggestions for the input too?
Can you please leave a comment where the error occurs?
Expected BEGIN_OBJECT but was STRING at line 1 column 13 path $.desc Expected BEGIN_OBJECT but was STRING at line 1 column 13 path $.nameBytes
this might be a solution to your issue: stackoverflow.com/questions/28418662/…
Thank you I was able to get pass that using encoder.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.