在JSP视图中显示递归模型时,如何解决“无法从类型java.lang.String转换为类型@ javax.persistence.Id的问题”

时间:2019-06-26 15:09:59

标签: java spring-mvc jsp

我创建了一个具有递归关系的模型,但是当我在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调用SEVERE: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在路径[/ ecommerce]的上下文中为Servlet [dispatcher]调用SEVERE: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用于值'null';   嵌套的异常为java.lang.NumberFormatException:对于输入字符串:“ null”],根本原因为java.lang.NumberFormatException:对于输入字符串:“ null” ...

1 个答案:

答案 0 :(得分:0)

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

此代码的一个示例是:

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

}

--------------------------------- AND ----------------- ----------

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();

}