Как исправить ошибку «Не удалось преобразовать тип java.lang.String в тип @ javax.persistence.Id», когда отображается рекурсивная модель в представлении JSP. - PullRequest
1 голос
/ 26 июня 2019

Я создал модель с рекурсивным отношением, но когда я показываю ее в form:select в представлении JSP, она возвращает ошибку о преобразованиях типов данных, как я могу показать рекурсивную модель в представлении JSP?

Я использую Java 1.8 и Spring-Core 4.1.

Когда я показываю строку базы данных, это рекурсивное поле null, оно работает, но когда я пытаюсь показать строку срекурсивное поле заполнено допустимым значением, оно не работает и генерирует ошибку.

это поле модели из класса Category

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

Вместо отображения компонента, он ломается игенерация ошибки ниже:

26 июня 2019 г. 16:03:09. org.apache.catalina.core.ApplicationDispatcher вызывает SEVERE: Servlet.service () для сервлета [jsp] вызвал исключительную ситуацию Java.lang.NumberFormatException: для входной строки:«null» в java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) ...

26 июня 2019 г. 16:03:09 org.apache.catalina.core.StandardWrapperValve вызывает SEVERE: сервлет.service () для сервлета [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 для значения 'null';Вложенное исключение: java.lang.NumberFormatException: для входной строки: «null»] с первопричиной java.lang.NumberFormatException: для входной строки: «null» ...

1 Ответ

0 голосов
/ 29 июня 2019

Что ж, я делаю проект на Java с помощью Spring, и мне нужно создать папку с именем Converters и создать конвертер всех классов домена, которые у меня есть.Мне нужно создать два конвертера, один из строки в домен classe и наоборот

Пример этого кода:

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...