Метод контроллера Invoke REST возвращает 404 null

Я хочу создать архитектуру тумана. У меня есть 2 сервера в облаке и клиент-серверное приложение, где сервер является своего рода сервером тумана. Облачные серверы предназначены для связи с базой данных. Проблема в том, что я пытаюсь сделать регистрацию в своем приложении. Я хочу проверить, существует ли пользователь в базе данных в момент проверки. Когда я вызываю метод rest, он возвращает «404 null».

Контроллер REST с методом проверки наличия пользователей. Когда я вызываю этот метод с помощью http: // локальный: 8081 / пользователь / тест, он возвращает JSON

{"userID":1,"username":"test","password":"test","events":[]}

UserController.java

    @RestController
    public class UserController {

    @Autowired
    private UserRepository userRepository;

    @RequestMapping(value = "/user/{username}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<User> getUserByUsername(@PathVariable("username") String username) {
        User user = userRepository.findByUsername(username);

        if (user == null) {
            return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
        }

        return new ResponseEntity<User>(user, HttpStatus.OK);
    }

    @RequestMapping(value = "/user/", method = RequestMethod.POST)
    public ResponseEntity<Void> addUser(@RequestBody User user, UriComponentsBuilder ucBuilder) {
        userRepository.save(user);

        HttpHeaders headers = new HttpHeaders();
        headers.setLocation(ucBuilder.path("/user/{id}").buildAndExpand(user.getUserID()).toUri());
        return new ResponseEntity<Void>(headers, HttpStatus.CREATED);
    }
}

И теперь я пытаюсь получить этого пользователя на сервере тумана следующим образом:

public boolean sendRequestIfUserExists(String username) {
    CloudServer cloudServer = getAvailableServer();
    if (cloudServer != null) {
        ResponseEntity<User> userEntity = restTemplate.getForEntity(cloudServer.getURI() + "/user/" + username, User.class);
        changeServerStatusToAvailable(cloudServer.getServerName());
        HttpStatus status = userEntity.getStatusCode();
        if (status == HttpStatus.NOT_FOUND) {
            SpeechRecognitionApplication.logger.info("User: " + username + "does not exist");
            return false;
        }
    }

    return true;
}

И эта строка:

  ResponseEntity<User> userEntity = restTemplate.getForEntity(cloudServer.getURI() + "/user/" + username, User.class);

Выдает исключение:

org.springframework.web.client.HttpClientErrorException: 404 null
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:775) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:728) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:684) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:359) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at pl.speechrecognition.services.CloudService.sendRequestIfUserExists(CloudService.java:65) ~[classes/:na]
    at pl.speechrecognition.controller.IndexController.postRegister(IndexController.java:53) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]

Редактировать: Наконец я нашел решение для этого исключения. Это произошло потому, что у меня был неправильный Контруктор в классе User.

User.java

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {

private Long userID;
private String username;

private String password;
private List<Event> events;

public Long getUserID() {
    return userID;
}

public void setUserID(Long userID) {
    this.userID = userID;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public List<Event> getEvents() {
    return events;
}

public void setEvents(List<Event> events) {
    this.events = events;
}

public User(String username) {
    this.username = username;
}

public User(String username, String password) {
    this.username = username;
    this.password = password;
}
public String toString() {
    return "Username: " + username;
}


// Missing constructor
public User(Long userID, String username, String password, List<Event> events) {
    this.userID = userID;
    this.username = username;
    this.password = password;
    this.events = events;
}
}

Но теперь выкидывает:

org.springframework.web.client.RestClientException: Error while extracting response for type [class pl.speechrecognition.model.User] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `pl.speechrecognition.model.User` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `pl.speechrecognition.model.User` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (PushbackInputStream); line: 1, column: 2]
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:115) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:1000) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:983) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:730) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]

Не имеет отношения к проблеме, но рекомендуется использовать пути для отдыха «/ users /», а не «/ user». Таким образом, отдельный ресурс будет «/ users / <id>», а POST для создания пользовательского ресурса будет «/ users».

Yogesh_D 28.05.2018 19:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
3 124
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы пытались включить журналы, чтобы увидеть, куда именно инициируется вызов? Попробуйте добавить: logging.level.org.springframework.web = DEBUG Вы должны увидеть полный URL.

Надеюсь, это поможет вам в дальнейшей отладке.

Я сделал это и не могу понять, почему метод, который возвращает ошибку, отправляет 4 запроса на получение

Rafał Sokalski 28.05.2018 18:57
Ответ принят как подходящий

Наконец я нашел решение. Возникла проблема с конструкторами. Когда я добавил конструктор со всеми аргументами, я обнаружил информацию о том, что для десериализации JSON Spring также нужен конструктор с нулевым аргументом.

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