Объект запроса spring resttemplate не сопоставляется с контроллером отдыха

у меня ниже resttempalte, который вызывает контроллер отдыха другой службы.

    @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;
}

и в моем сервисе у меня есть контроллер, который потребляет вышеуказанный запрос.

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

когда я пробую свой тест ... возраст, который я проталкиваю через шаблон отдыха, не отображается ... и я всегда получаю возраст как 0 в моей системе. выход ... что может быть не так в моем коде ... и есть ли что-то отсутствует с точки зрения конфигурации ..

РЕДАКТИРОВАТЬ -

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

}

контроллер

    @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 {

@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;
}

}

Не могли бы вы поделиться полным классом контроллера? Также, пожалуйста, поделитесь классом UserMO и APIReqDataMO

Rohit Agarwal 07.11.2022 17:53
1
1
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема

Возникла проблема с реализацией API. Вы создаете POST API, и когда пользователь будет вызывать этот API, передав UserMO в теле запроса, сопоставление не произойдет, потому что аннотация @RequestBody отсутствует.

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

Решение

Если вы используете аннотацию @RestController поверх класса контроллера, добавьте аннотацию @RequestBody перед UserMO userMO и повторите попытку.

Как это

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

если вы используете аннотацию @Controller поверх класса контроллера, добавьте аннотацию @ResponseBody поверх метода fuzzerServiceAge() и аннотацию @RequestBody перед UserMO userMO и повторите попытку.

Как это

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

это сработало .. кажется, я пропустил спецификацию здесь ..

pappu_kutty 08.11.2022 10:07

Другие вопросы по теме