Как преобразовать поле enum в строку в приложении весенней загрузки, сохраняя в столбце mysql varchar - PullRequest
2 голосов
/ 20 мая 2019

У меня есть класс enum с типами пользователей admin, client и supplier. Я аннотировал свой атрибут userType в классе User Model с помощью @Enumerated (EnumType.STRING). Тем не менее, я имею ошибку несоответствия типов при запуске моего кода.

Я использую весеннюю загрузку и базу данных mysql с varchar для поля типа пользователя Enum. мой код ниже содержит более подробную информацию.

Мой enum класс

UserType.java

   public enum UserType {

     CLIENT ("Client"),
     SUPPLIER ("Supplier"),
     ADMIN ("Admin");

     private final String type;

     UserType (String userType){

       this.type = userType;

     }

     public String getType() {

       return this.type;
     }
   }

User.java

фрагмент кода для типа пользователя UserType.

@Entity
public class User{

 @Enumerated(EnumType.STRING)
 @Column (name = "user_type", nullable = false)
 private UserType utype;

 @Enumerated(EnumType.STRING)
 public UserType getUtype() {

   return utype;
 }

 @Enumerated(EnumType.STRING)
 public void setUtype(UserType utype) {
   this.utype = utype;
 }
}

Контроллер

   @GetMapping(value="/newUser")
   public String registrationForm(Model model){
     model.addAttribute("user", new User());
     model.addAttribute("UserTypes", UserType.values());

     return "register";
   }

  @PostMapping(value="/registerUser")
  public String registerUser(@ModelAttribute(value = "user") User user){

        userService.save(user);
        return "pages/login";
   }

ThymeLeaf Просмотр файла

register.html

     <select th:field="*{utype}" >
      <option th:each="usertype : ${UserTypes}"
             th:text="${usertype.type}"
     th:value="utype">
    </option>
    </select>

Я ожидал, что входные данные для типа будут преобразованы в строку, но у меня появляется следующая ошибка.

Ошибка поля в объекте 'user' в поле 'utype': отклоненное значение [utype]; коды [typeMismatch.user.utype, typeMismatch.utype, typeMismatch.com.grocery.demo.Model.UserType, typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.utype, utype]; аргументы []; сообщение по умолчанию [utype]]; сообщение по умолчанию [Не удалось преобразовать значение свойства типа 'java.lang.String' в требуемый тип 'com.grocery.demo.Model.UserType' для свойства 'utype'; вложенным исключением является org.springframework.core.convert.ConversionFailedException: не удалось преобразовать тип [java.lang.String] в тип [@ javax.persistence.Enumerated @ javax.persistence.Column com.grocery.demo.Model.UserType] для значения 'utype'; вложенное исключение: java.lang.IllegalArgumentException: без константы перечисления com.grocery.demo.Model.UserType.utype]]

mysql настраивается с помощью application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/FredSystems
spring.datasource.username=root
spring.datasource.password=fred@2017
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create

spring.jpa.show-sql=true
spring.messages.basename=validation


 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

Ответы [ 4 ]

1 голос
/ 20 мая 2019

Сделайте это так же просто, как показано ниже:

Контроллер

 @GetMapping(value="/newUser")
   public String registrationForm(Model model){
     model.addAttribute("user", new User());
     model.addAttribute("UserTypes",Arrays.asList(UserType.values()));
     return "register";
   }

В твоем чабреце:

<select th:field="*{utype}" >
      <option th:each="usertype : ${UserTypes}"
             th:text="${usertype}"
     th:value="${usertype}">
    </option>
    </select>

Если JSP:

<select id="editState"class="form-control">
                        <c:forEach items="${UserTypes}" var="ut" varStatus="loop">
                            <option value="${ut}">${ut}</option>
                        </c:forEach>                        
                    </select>
0 голосов
/ 23 мая 2019

Проблема в вашем register.html:

   <select th:field="*{utype}" >
      <option th:each="usertype : ${UserTypes}"
             th:text="${usertype.type}"
     th:value="utype">
    </option>
    </select>

В теге th: value используется неверная ссылка на поле utype . Вы должны использовать переменное выражение, где вы объявляете, какое значение вы хотите связать с utype вашего * объекта User * поле . Так и должно быть примерно так:

   <select th:field="*{utype}" >
      <option th:each="usertype : ${UserTypes}"
             th:text="${usertype.type}"
     th:value="${usertype}">
    </option>
    </select>

Если он все еще не работает, посмотрите мой обновленный пример проекта: https://github.com/gybandi/spring-ui-demo

0 голосов
/ 23 мая 2019

Во-первых, попробуйте в enum поле, которое точно соответствует вашему значению ENUM. Это облегчит выбор любого перечисления

например.

public enum UserType {

 CLIENT ("CLIENT","Client"),
 SUPPLIER ("SUPPLIER","Supplier"),
 ADMIN ("ADMIN","Admin");

 private final String type;
 private final String name;

 UserType (String name, String userType){
   this.name=name;
   this.type = userType;

 }

 public String getType() {

   return this.type;
 }

}

Для вашей цели вы можете попробовать переопределить метод toString () в соответствии с вашими значениями.

0 голосов
/ 20 мая 2019

в вашем перечислении добавьте этот метод

public static UserType getByName(String name) {
        for (UserType type : UserType.values()) {
            if (type.getName().equals(name)) {
                return type;
            }
        }
        return null;
    }

в ваш тимелеф

<select th:field="*{utype}" >
      <option th:each="usertype : ${UserTypes}"
             th:text="${usertype.type}"
     th:value="${utype.type}">
    </option>
    </select>

и затем из бэкэнда попытайтесь использовать метод getByName для анализа вашего ввода HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...