2015-12-04 1 views
0

У меня есть объект User, и Role объект. Каждый пользователь имеет одну роль. В базе данных роль является внешним ключом в таблице roles, где каждая роль имеет только числовой идентификатор в качестве первичного ключа и некоторое текстовое имя роли («admin», «user»).Как сократить REST JSON с внешними ключами

Теперь я хочу, чтобы иметь возможность просто POST следующие JSON:

{"name": "John", "role": "admin"} 

Как сделать это?

я в конечном итоге остроумие этой ошибки:

Could not read document: Can not instantiate value of type [simple type, class Role] from String value ('admin'); no single-String constructor/factory method\n at [Source: [email protected]; line: 1, column: 17] (through reference chain: User[\"role\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, Role] from String value ('admin'); no single-String constructor/factory method\n at [Source: [email protected]; line: 1, column: 17] (through reference chain: User[\"role\"]) 

модель пользователя:

@Entity 
@Table(name = "users") 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @NotNull 
    private String name; 

    @NotNull 
    @ManyToOne 
    private Role role; 

    // Getters and setters... 
} 

Роль модель:

@Entity 
@Table(name = "roles") 
public class Role { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @NotNull 
    private String name; 

    // Getters and setters... 
} 

ответ

2

Помимо коррекции ваш JSON, я думаю, что Вы будете нуждаться по крайней мере, две вещи: конструктор Строка для Role, и @Column аннотацию с unique=true на Role.name

@Entity 
@Table(name = "roles") 
public class Role { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @Column(unique=true, nullable=false) 
    private String name; 

    public Role() {} 

    public Role(String name) { 
    this.name = name; 
    } 

    // Getters and setters... 
} 

Тогда вы должны убедиться, что, когда вы сохраняете User. Role загружается из базы данных и заменяется на User.role, иначе вы можете получить SQLIntegrityConstraintViolationException (потому что вы пытаетесь сохранить новый экземпляр Role с именем, которое уже принято).

+0

С какого пакета следует импортировать @Unique? – Pitel

+1

Извините, я не проверял. Вы должны использовать '@Column (unique = true, nullable = false)' ('javax.persistence.Column'). См. Обновленный ответ. –

1

Ваш JSON не является действительным, изменить его к этому:

{ 
    "name": "John", 
    "role": "admin" 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^