如何在弹簧启动应用程序中将枚举字段转换为字符串并保存到mysql varchar columnm

时间:2019-05-20 08:31:54

标签: java spring-boot spring-mvc

我有一个枚举类,用户类型为admin,client和Supplier。我在用户模型类中用@Enumerated(EnumType.STRING)注释了我的userType属性。但是,运行代码时出现类型不匹配的错误。

我正在使用带有varchar的spring boot和mysql数据库作为Enum usertype字段。我下面的代码有更多详细信息。

我的枚举类

UserType.java

stages:
  - test

integration-tests:
  stage: test
  tags:
    - host-vm-shell
  script:
    - docker run --rm -it -u username -v $SCRIPT_DIR:/tests-folder $HOSTS $DOCKER_IMAGE
    - robot test-1.robot 

User.java

用户类型utype的代码段。

   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;
     }
   }

控制器

@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;
 }
}

百里香叶查看文件

register.html

   @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";
   }

我希望将utype的输入转换为字符串,但是出现以下错误。

对象“用户”中字段“ utype”上的字段错误:拒绝的值[utype];代码[typeMismatch.user.utype,typeMismatch.utype,typeMismatch.com.grocery.demo.Model.UserType,typeMismatch];参数[org.springframework.context.support.DefaultMessageSourceResolvable:代码[user.utype,utype];参数[];默认消息[utype]];默认消息[未能将类型'java.lang.String'的属性值转换为属性'utype'的必需类型'com.grocery.demo.Model.UserType';嵌套异常是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配置的

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

4 个答案:

答案 0 :(得分:1)

执行以下简单操作:

控制器

 @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>

答案 1 :(得分:0)

在您的枚举中添加此方法

$x = Get-Content -Path "C:\Users\Desktop\abc*.txt"
[array]::Reverse($x)

$d = foreach($line in $x)
{
    if($line - like "HEllo")

    {
        #Read the text file till "hello" and copy the contents
    }
}

在胸腺叶中

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

然后从后端尝试使用getByName方法来解析您的HTML输入。

答案 2 :(得分:0)

首先,尝试在枚举中包含一个与您的ENUM值完全匹配的字段。这样可以轻松获取任何枚举

例如

while id < x and id > y

}

出于您的目的,您可以尝试根据您的值覆盖toString()方法。

答案 3 :(得分:0)

问题出在您的register.html中:

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

在th:value标记中,您对 utype 字段使用了错误的引用。您应该使用变量表达式,在其中声明要绑定到User对象的utype field value 。所以应该是这样的:

   <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