Search code examples
springspring-bootspring-resttemplate

spring resttemplate request object not mapping to rest controller


i have below resttempalte which invokes rest controller of another service..

    @Override
public ResponseEntity<String> callRestAPI(APIReqDataMO apiReqDataMO) {
    String apiURL = URIGenerator.getAPIURL(apiReqDataMO);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
    HttpEntity<?> request = new HttpEntity<>(apiReqDataMO.getRequestObject(), headers);
    ResponseEntity<String> httpRes = restTemplate.postForEntity(apiURL, request, String.class);
    return httpRes;
}

and in my service i have controller, which consumes above request..

@RequestMapping(value = "/targetService/createUser", method = RequestMethod.POST, consumes = "application/json")
public String fuzzerServiceAge(UserMO userMO) {
    System.out.println("---------------------age is -------------------------" + userMO.getAge());
    if (userMO.getAge() > 0) {
        System.out.println("error age greater than 0 ");
        return "invalid user age";
    } else if (userMO.getAge() == 0) {
        return "invalid user age";
        
    }
    return "user added successfully";
}

when i try my test.. the age which i am pushing through rest template is not getting mapped..and i am getting age as 0 always in my system.out.. what could be wrong in my code... and is there anything missing from configuration perspective..

EDIT -

public class APIReqDataMO {

private String restAPIURL;

private Object[] pathParam;

private Object[] requestParam;

private String requestType;

private String paramType;

private Object requestObject;

public String getParamType() {
    return paramType;
}

public void setParamType(String paramType) {
    this.paramType = paramType;
}

public String getRequestType() {
    return requestType;
}

public void setRequestType(String requestType) {
    this.requestType = requestType;
}

public Object getRequestObject() {
    return requestObject;
}

public void setRequestObject(Object requestObject) {
    this.requestObject = requestObject;
}

public String getRestAPIURL() {
    return restAPIURL;
}

public void setRestAPIURL(String restAPIURL) {
    this.restAPIURL = restAPIURL;
}

public Object[] getPathParam() {
    return pathParam;
}

public void setPathParam(Object[] pathParam) {
    this.pathParam = pathParam;
}

public Object[] getRequestParam() {
    return requestParam;
}

public void setRequestParam(Object[] requestParam) {
    this.requestParam = requestParam;
}

}

controller

    @PostMapping("/targetService/createUser")
public String fuzzerServiceAge(UserMO userMO) {
    
    System.out.println("--------------------- age is -------------------------" + userMO.getAge());
    if (userMO.getAge() > 0) {
        // return ResponseEntity.ok("Hello World!");
    } else if (userMO.getAge() == 0) {
        System.out.println(" it is else block");
        // return ResponseEntity.badRequest().build();
    }
    // return ResponseEntity.ok("user added successfully!");
    return "user added successfully";
}

usermo

public class UserMO {

@JsonProperty("name")
private String name;

@JsonProperty("age")
private int age;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

}


Solution

  • Issue

    There is an issue in API implementation. You are creating POST API and when the user will invoke this API by passing UserMO in the request body then mapping won't happen because the @RequestBody annotation is missing.

    @PostMapping("/targetService/createUser")
    public String fuzzerServiceAge(UserMO userMO) {
        
        System.out.println("--------------------- age is -------------------------" + userMO.getAge());
        if (userMO.getAge() > 0) {
            // return ResponseEntity.ok("Hello World!");
        } else if (userMO.getAge() == 0) {
            System.out.println(" it is else block");
            // return ResponseEntity.badRequest().build();
        }
        // return ResponseEntity.ok("user added successfully!");
        return "user added successfully";
    }
    

    Solution

    If you are using @RestController annotation on top of the controller class then add @RequestBody annotation before UserMO userMO and try again.

    Like this

    @PostMapping("/targetService/createUser")
    public String fuzzerServiceAge(@RequestBody UserMO userMO) {
    //logic
    }
    

    if you are using @Controller annotation on top of the controller class then add @ResponseBody annotation on top of method fuzzerServiceAge() and @RequestBody annotation before UserMO userMO and try again.

    Like this

    @PostMapping("/targetService/createUser")
    @ResponseBody
    public String fuzzerServiceAge(@RequestBody UserMO userMO) {
    //logic
    }