首页 > 解决方案 > 在 JSP 视图中显示递归模型时如何修复“无法从类型 java.lang.String 转换为类型 @javax.persistence.Id”

问题描述

我创建了一个具有递归关系的模型,但是当我form:select在 JSP 视图中显示它时,它返回有关数据类型转换的错误,如何在 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.service() for servlet [jsp] throw exception java.lang.NumberFormatException: For input string: "null" at java. lang.NumberFormatException.forInputString(NumberFormatException.java:65)...

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

标签: javaspring-mvcjsp

解决方案


好吧,我正在用 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();

}

推荐阅读