【问题标题】:How to fix "Failed to convert from type java.lang.String to type @javax.persistence.Id" when show a recursive model in a JSP view在 JSP 视图中显示递归模型时如何修复“无法从 java.lang.String 类型转换为 @javax.persistence.Id 类型”
【发布时间】:2019-11-08 14:05:31
【问题描述】:

我创建了一个具有递归关系的模型,但是当我在 JSP 视图中将其显示在 form:select 中时,它返回有关数据类型转换的错误,如何在 JSP 视图中显示递归模型?

我使用的是 Java 1.8 和 spring-core 4.1。

当我显示一个数据库行时,递归字段是null,它可以工作,但是当我尝试显示一个递归字段填充了有效值的行时,它不起作用并生成错误。

这是类别中的模型字段

@OneToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
@JoinColumn(nullable=true)
private Category subCategory;

我的控制器向 JSP 视图发送一个名为“category”的 Category 对象

modelAndView.addObject("category", category);

在视图中我通过表单显示对象:选择组件

<form:select path="subCategory.id" 
             id="category_subCategory"
             multiple="false"
             cssClass="form-control">
  <form:option value="null">-</form:option>
  <form:options items="${categories}"
                itemValue="id"
                itemLabel="name"/>
</form:select>

它没有显示组件,而是破坏并生成以下错误:

2019 年 6 月 26 日下午 4:03:09 org.apache.catalina.core.ApplicationDispatcher 调用严重:Servlet [jsp] 的 Servlet.service() 引发异常 java.lang.NumberFormatException:对于输入字符串:java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 处的“null”...

2019 年 6 月 26 日下午 4:03:09 org.apache.catalina.core.StandardWrapperValve 调用严重:servlet [dispatcher] 在路径 [/ecommerce] 的上下文中的 Servlet.service() 引发异常 [javax.servlet. ServletException: javax.servlet.jsp.JspException: org.springframework.core.convert.ConversionFailedException: 无法从 java.lang.String 类型转换为 @javax.persistence.Id @javax.persistence.GeneratedValue java.lang.Integer 类型值“空”; 嵌套异常是 java.lang.NumberFormatException: For input string: "null"] with root cause java.lang.NumberFormatException: For input string: "null"...

【问题讨论】:

    标签: java spring-mvc jsp


    【解决方案1】:

    嗯,我正在用 Spring 用 Ja​​va 做一个项目,我必须创建一个名为 Converters 的文件夹,并为我拥有的所有域类创建一个转换器。 我需要创建两个转换器,一个从字符串到域类,反之亦然

    此代码的一个示例是:

    package converters;
    
    import org.springframework.core.convert.converter.Converter;
    import org.springframework.stereotype.Component;
    import org.springframework.transaction.annotation.Transactional;
    
    import domain.Application;
    
    @Component
    @Transactional
    public class ApplicationToStringConverter implements Converter<Application, String> {
    
        @Override
        public String convert(final Application application) {
            String result;
    
            if (application == null)
                result = null;
            else
                result = String.valueOf(application.getId());
    
            return result;
        }
    
    }
    

    -------------------------------------------------------------- ----------

    package converters;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.convert.converter.Converter;
    import org.springframework.stereotype.Component;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.util.StringUtils;
    
    import repositories.ApplicationRepository;
    import domain.Application;
    
    @Component
    @Transactional
    public class StringToApplicationConverter implements Converter<String, Application> {
    
        @Autowired
        ApplicationRepository   applicationRepository;
    
    
        @Override
        public Application convert(final String text) {
            Application result;
            int id;
    
            try {
                if (StringUtils.isEmpty(text))
                    result = null;
                else {
                    id = Integer.valueOf(text);
                    result = this.applicationRepository.findOne(id);
                }
            } catch (final Throwable oops) {
                throw new IllegalArgumentException(oops);
            }
    
            return result;
        }
    
    }
    

    ---------应用类----------

    @Entity
    @Access(AccessType.PROPERTY)
    public class Application extends DomainEntity {
    
        private Date        moment;
        private String      explication;
        private String      urlCode;
    
    
        @NotNull
        public Date getMoment() {
            return this.moment;
        }
    
        public void setMoment(final Date moment) {
            this.moment = moment;
        }
    
        @NotNull
        @SafeHtml(whitelistType = SafeHtml.WhiteListType.NONE)
        public String getExplication() {
            return this.explication;
        }
    
        public void setExplication(final String explication) {
            this.explication = explication;
        }
    
        @NotNull
        @URL
        @SafeHtml(whitelistType = SafeHtml.WhiteListType.NONE)
        public String getUrlCode() {
            return this.urlCode;
        }
    
        public void setUrlCode(final String urlCode) {
            this.urlCode = urlCode;
        }
    
        public Date getSubmitMoment() {
            return this.submitMoment;
        }
    
        public void setSubmitMoment(final Date submitMoment) {
            this.submitMoment = submitMoment;
        }
    
    }
    

    ---- 存储库类 ---------

    package repositories;
    
    import java.util.Collection;
    import java.util.List;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.stereotype.Repository;
    
    import domain.Application;
    
    @Repository
    public interface ApplicationRepository extends JpaRepository<Application, Integer> {
    
        @Query("select a from Application a where a")
        public Collection<Application> getAllApplications();
    
    }
    

    【讨论】:

    • 在这种情况下,Application 和 ApplicationRepository 类是什么?如果你想检查结构,我把项目的下载链接留在这里。 1drv.ms/u/s!AgY6X8zeuYO6ggx_fEASxUwINdPZ?e=NTgGXF
    • 我已经添加了我的 domian Application 类和 ApplicationRepository
    • 抱歉回复晚了,我现在才去查,没看懂你的回答,我是java初学者。
    • 出现此错误是因为框架需要知道如何将模型转换为字符串中的对象,反之亦然,也就是说,当您打印选择时,您输入了项目 ID 和值,但是框架需要知道如何将 Category 转换为字符串,这与我的转换器 ApplicationToString 类似
    • 当您发送公式时,您可能会发现无法转换对象中的字符串,因为框架需要知道如何转换您的 id(即公式中的字符串)对象类别,这是我的转换器 StringToApplication。应用程序是我的模型对象。我的 ApplicationRepository 只是一个接口,我可以在其中对我的数据库进行一些查询。
    猜你喜欢
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多