#java #spring-boot #rest #spring-mvc
#java #spring-boot #rest #spring-mvc
Вопрос:
У меня есть метод в моем RestController, который принимает объект:
@RestController
@RequestMapping(value = "/statistic")
public class MyController {
@Autowired
private StatisticService statistic;
@RequestMapping(method=RequestMethod.POST, value="/add")
public ResponseEntity<String> add(@RequestBody PersonData personData) {
if(statistic.addToStatistic(personData)) {
return new ResponseEntity<String>(HttpStatus.OK);
}
return new ResponseEntity<String>("Person already exists", HttpStatus.CONFLICT);
}
}
Я хочу отправить объект с моего другого контроллера. Я только прочитал, что я могу отправить объект в / statistic / add в формате json через разные инструменты браузера (REST-клиенты). Но мой другой контроллер принимает только «login» (уникальное имя), и он должен создать объект из этого имени входа и отправить в / statistic/add. Таким образом, я хотел создать объект json и отправить его, но я получаю сообщение об ошибке
org.springframework.web.client.RestClientException: No HttpMessageConverter for org.codehaus.jettison.json.JSONObject
Вот моя попытка:
@Controller
@RequestMapping("/main")
public class ViewController {
@RequestMapping(value = "/newPerson/{login}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<String> registerNewPerson(@PathVariable String login) {
RestTemplate restTemplate = new RestTemplate();
try {
String uri_create = "http://localhost:8082/add/";
//creation of json doesnt't help
JSONObject entity = new JSONObject();
entity.put("login", login);
entity.put("points", 0);
ResponseEntity<String> responce = restTemplate.postForEntity(uri_create, entity, String.class);
return responce;
} catch(Exception e) {
e.printStackTrace();
return null;
}
}
}
Комментарии:
1.
add(..)
требуется,PersonData
который, по-видимому, не соответствует JSONObject, встроенному вregisterNewPerson(...)
метод. Для контроллера необычно вызывать другой контроллер. В общем случае контроллер должен делегировать службе (ам) выполнение своей работы, и несколько контроллеров могут совместно использовать службы.2. @AndrewS не могли бы вы опубликовать пример объяснения для этого случая?
3. Вводите / autowire
StatisticService statistic
вViewController
(то же, чтоMyController
) и вызывайтеStatisticService
методы непосредственно изregisterNewPerson(...)
метода.4. @AndrewS спасибо за ваш ответ. Но эти два контроллера находятся в разных проектах, поэтому StatisticService находится в проекте с MyController, а ViewController — в другом проекте. Это как разные микросервисы. Я думаю, что здесь невозможно внедрить сервис. Или тогда лучше использовать один микросервис с 2 контроллерами?
5. Или тогда лучше использовать один микросервис с 2 контроллерами? Это зависит от области применения каждой службы. Например, эти два метода, по-видимому, связаны с идентификатором пользователя.