java - 在 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" ...
解决方案
好吧,我正在用 Spring 用 Java 做一个项目,我必须创建一个名为 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();
}
推荐阅读
- django - 在 django rest 框架中为多种类型的用户处理一个用户模型
- reactjs - 使用 reducer 从 redux 获取状态的动作结构
- python - 如何在通过 ESP8266 运行的 micropython 中安装 snmplib 模块?
- oracle - ADF:无法让每个参数在接收器的查询中起作用
- javascript - 未处理的拒绝错误:WHERE 参数“number_phone”具有无效的“未定义”值
- java - 我怎样才能使这段代码更简单?另外我如何检查输入是否为int?
- oracle - Oracle 根据 id 确定表空间名称
- java - 如何通过 intellij IDE 的 maven 插件添加新的 azure 功能
- google-apps-script - 如何使用 UrlFetchApp 为 BigQuery Rest API 添加媒体上传?
- amazon-web-services - 我正在将本地 Kibana 服务器(ec2 实例)连接到 Amazon ES