у меня ниже 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;
}
}
Проблема
Возникла проблема с реализацией 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
}
это сработало .. кажется, я пропустил спецификацию здесь ..
Не могли бы вы поделиться полным классом контроллера? Также, пожалуйста, поделитесь классом UserMO и APIReqDataMO