com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно десериализовать экземпляр объекта из токена START_ARRAY

Получение исключения MismatchedInputException. Искал здесь много вопросов, но в основном нашел JSONMappingException. Я не понимаю, одинаковые они или разные.

Ниже приведена сущность:

@Entity
@Table
@NamedQueries({
    @NamedQuery(name="User.findAll", query="SELECT u FROM User u"),
    @NamedQuery(name="User.findByEmail", query="SELECT u FROM User u WHERE u.email=:pEmail")
})
public class User {

@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid2")
@GeneratedValue(generator = "idGenerator")
private String id;
private String firstName;
private String lastName;

@Column(unique=true)
private String username;

@Column(unique=true)
private String email;
private String password;
private String role;
}

со всеми геттерами и сеттерами на месте.

Ниже приведена функция отображения контроллера:

@RequestMapping(method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public User create(@RequestBody User user) {
        return service.create(user);
    }

Ниже приведен сервис:

@Override
    @Transactional
    public User create(User user) {
        User existing = repository.findByEmail(user.getEmail());
        if(existing == null){
            repository.create(user);
        }
        return user;
    }

Ниже приведен репозиторий:

@Override
    public User findByEmail(String email) {
        TypedQuery<User> query = em.createNamedQuery("User.findByEmail", User.class);
        query.setParameter("pEmail", email);
        List<User> users = query.getResultList();
        if(users != null && users.size()==1){
            return users.get(0);
        }
        return null;
    }

    @Override
    public User create(User user) {
        em.persist(user);
        return user;
    }

Ниже приведены зависимости, которые я использовал:

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.0.pr2</version>
        </dependency>
<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.2.9.Final</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>

Тестирую через Postman, фронтенд еще не создал. Ниже приведен JSON, который я отправляю:

[{
    "firstName": "hgf",
    "lastName": "frew",
    "username": "erf",
    "email": "bgghjk",
    "password": "bgte",
    "role": "trrere"
  }
]

Наконец, ниже приведен журнал консоли:

Thu May 11 13:56:43 CDT 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
May 11, 2017 1:57:52 PM org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver handleHttpMessageNotReadable
WARNING: Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Can not deserialize instance of priyanka.movieflix.entity.User out of START_ARRAY token
 at [Source: (PushbackInputStream); line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Can not deserialize instance of priyanka.movieflix.entity.User out of START_ARRAY token
 at [Source: (PushbackInputStream); line: 1, column: 1]

Я не уверен, что вызывает это исключение. Когда я запускаю приложение, таблица создается в базе данных правильно, и я также правильно получаю данные в запросе GET.


person priyanka singh    schedule 11.05.2017    source источник


Ответы (1)


Вы сопоставили RequestBody с одним объектом User, но отправляете массив JSON.

[{
    "firstName": "hgf",
    "lastName": "frew",
    "username": "erf",
    "email": "bgghjk",
    "password": "bgte",
    "role": "trrere"
  }
]

Вместо этого вы должны отправить объект JSON следующим образом

{
    "firstName": "hgf",
    "lastName": "frew",
    "username": "erf",
    "email": "bgghjk",
    "password": "bgte",
    "role": "trrere"
}

или измените сопоставление контроллера, чтобы получить набор объектов User как

@RequestBody List<User> users
person Master Po    schedule 11.05.2017