Весенняя загрузка: как отправить объект в RestController с другого контроллера?

#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 контроллерами? Это зависит от области применения каждой службы. Например, эти два метода, по-видимому, связаны с идентификатором пользователя.