2015-12-06 3 views
0

У меня есть Пользовательский объект и поле Роль в этом объекте. Роль ENUM. Я пытаюсь создать пользователя из пользовательского интерфейса. Тем не менее, я получаю исключение:Исключение весны enum при отправке формы

org.springframework.beans.NullValueInNestedPathException: Invalid property 'role' of bean class [com.bionic.entities.User]: Could not instantiate property type [com.bionic.entities.Role] to auto-grow nested property path: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.bionic.entities.Role]: Is it an abstract class?; nested exception is java.lang.InstantiationException: com.bionic.entities.Role 

Вот моя Role.Enum:

package com.bionic.entities; 

import org.springframework.context.annotation.Bean; 
import org.springframework.stereotype.Component; 

import javax.annotation.Resource; 
@Resource 
public enum Role { 
ADMINISTRATOR(1, "administrator"), 
TRAINER(2, "trainer"), 
STUDENT(3, "student"), 
RESTRICTED_ADMINISTRATOR(4, "restricted_administrator"), 
RESTRICTED_TRAINER(5, "restricted_trainer"); 

private long id; 
private String name; 


Role(){} 

private Role(long id, String name) { 
    this.name = name; 
    this.id = id; 
} 

public long getId() { 
    return id; 
} 

public void setId(long id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

}

Мои User.class полей:

public class User { 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private long id; 
@Column(name = "first_name", nullable = false) 
private String firstName; 
@Column(name = "last_name", nullable = false) 
private String lastName; 
@Column(name = "email", nullable = false, unique = true) 
private String email; 
@Column(name = "password", nullable = false) 
private String password; 
@Column(name = "cell") 
private String cell; 
@Column(name="position") 
private String position; 

@Enumerated(EnumType.ORDINAL) 
@Column(name = "role_id") 
private Role role; 

и, наконец, мой HTML форма:

<form method="POST" action="/superAdmin/addUser" th:object="${user}"> 
<select name="role.id" size="2" th:field="*{role.id}" style="display: block" id="role.id"></select> 
    <br /> <br /> <input type="submit" value="Upload" class="submit-but"> 

Я провел 2 дня, чтобы решить это. Однако, это не было успешным

Как я создаю объект после:

@RequestMapping(value = "/addUser", method = RequestMethod.POST) 
public 
@ResponseBody 
String addUser(@ModelAttribute User user, Model model) { 
    try { 
     model.addAttribute("user", user); 
     superAdministratorService.addUser(user); 
     return "successful"; 
    } catch (Exception e) { 
     return "You failed to upload"; 
    } 
} 

ответ

1

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

Role(){} 

по

public Role(){} 

Я думаю, что это причина вашей проблемы. Но вы не можете установить публичный конструктор в перечислении, поэтому, возможно, вы должны изменить свою реализацию на конечный класс.

ОБНОВЛЕНИЕ

public static Role fromId(long id) { 
    if (1 == id) { 
     return ADMINISTRATOR; 
    } 
    // TODO else if for the rest of enum instances 
    } else { 
     throw new AssertionError("Role not know!"); 
    } 
} 

Возможное решение для этого будет следующим:

  • Используйте DTO (простой POJO с теми же свойствами, что User сущность и методы получения и установки) к получить объект в методе addUser, в этом DTO определите role как целое.
  • В вашем перечислении, создать метод, как один выше
  • Создание объекта сущностей из объекта де DTO, используя метод выше, чтобы установить role элемент в User сущности.
+0

Yeap, я попытался это, но я получаю: «Модификатор публика здесь не допускается» – quento

+0

Первоначально я написал в ответ, что перечисление не свойственно для этой ситуации, но в конце концов я удалил его, потому что не собирался ваш вопрос ... –

+0

okey. как я могу решить это с перечислением? – quento

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