Список привязки к флажку весной

У меня есть класс сущности предложения:

@Entity
public class Offer {

    public Offer(){}
    private int offerId;
    private String offerBanner;
    private String offerLongDesc; 
    private int offerLikeCount ;

    List<Category> categoryList ;

    @DateTimeFormat(pattern= "dd/MM/yyyy")
    private Date offerStartDate; 
    <----all getters and setters---->    
}

И класс сущности категории @Entity public class Category{

    public Category() {}

    private int categoryId;
    private int categoryParentId;
    private String categoryName;
    private Date categoryCreationDate;
    <--getters n setters--->

}

В моей форме offerDetails я пытаюсь привязать категориюList (сущность предложения атрибута) к флажку

offerEntry.jsp

<form:form class="form-horizontal" action="/addOffer" commandName="offerDetails" method="post" enctype="multipart/form-data" style=" margin-top:20px; padding-right:50px; padding-left:10px; ">

    <div class="checkbox-list">
        <c:forEach var="category" varStatus="categoryStatus" items="${categoriesList}">
            <form:checkbox path="categoryList"  value="${category.categoryId}"/> <c:out                                                 value="${category.categoryName}" /><br>
        </c:forEach>
    </div>
    <-----Other div elements------>

</form:form>

У меня есть класс сущности предложения:

@Entity
public class Offer {

    public Offer(){}
    private int offerId;
    private String offerBanner;
    private String offerLongDesc; 
    private int offerLikeCount ;

    List<Category> categoryList ;

    @DateTimeFormat(pattern= "dd/MM/yyyy")
    private Date offerStartDate; 
    <----all getters and setters---->    
}

И класс сущности категории @Entity public class Category{

    public Category() {}

    private int categoryId;
    private int categoryParentId;
    private String categoryName;
    private Date categoryCreationDate;
    <--getters n setters--->

}

В моей форме offerDetails я пытаюсь привязать категориюList (сущность предложения атрибута) к флажку

offerEntry.jsp

<form:form class="form-horizontal" action="/addOffer" commandName="offerDetails" method="post" enctype="multipart/form-data" style=" margin-top:20px; padding-right:50px; padding-left:10px; ">

    <div class="checkbox-list">
        <c:forEach var="category" varStatus="categoryStatus" items="${categoriesList}">
            <form:checkbox path="categoryList"  value="${category.categoryId}"/> <c:out                                                 value="${category.categoryName}" /><br>
        </c:forEach>
    </div>
    <-----Other div elements------>

</form:form>

и вот мой контроллер:

@RequestMapping(value = {"/addOffer"}, method = RequestMethod.GET)
public ModelAndView offerForm() {

    ModelAndView mv = new ModelAndView("offerEntry");
    Offer offer = new Offer();
    try{
        List<Category> categoryList=categoryRepository.getAllCategories();
        mv.addObject("categoriesList",categoryList);
    }catch(Exception e)
    {
    }
    mv.addObject("offerDetails",offer);
    return mv;
}

Класс преобразователя:

public class CategoryIdtoCategory implements Converter<String, Category>
{
    @Inject
    private CategoryRepository categoryRepo;
    @Override
    public Category convert(String  categoryId)
    {
    try{
        int categoryIdI = Integer.parseInt(categoryId);
        return categoryRepo.findCategoryById(categoryIdI);
    }catch (Exception e){
        e.printStackTrace();
        return null;
    }
}

При отправке я хочу, чтобы выбранные значения флажков заполняли коллекцию offerDetails.categoryList.

Я также зарегистрировал конвертер (для преобразования этих идентификаторов категорий в объекты категорий)

Регистрация бина:

<beans:bean id="conversionService"  class="org.springframework.format.support.FormattingConversionServiceFactoryBean" >
    <beans:property name="converters">
        <beans:list>
            <beans:bean class="com.service.util.CategoryIdtoCategory"/>
        </beans:list>
    </beans:property>
</beans:bean>

Я все еще получаю следующую ошибку:

[Не удалось преобразовать значение свойства типа «java.lang.String» в требуемый тип «java.util.List» для свойства «categoryList»; вложенным исключением является java.lang.IllegalStateException: невозможно преобразовать значение типа [java.lang.String] в требуемый тип [com.domain.Category] для свойства 'categoryList[0]': не найдены подходящие редакторы или стратегия преобразования]

Я новичок в Spring. Пожалуйста, извините меня, если это глупый вопрос. Ваша помощь будет оценена. :)


person user3649329    schedule 06.09.2014    source источник


Ответы (2)


  1. В пути изменения JSP для ссылки на категорию
  2. В категории сущность переопределяет методы равенства и хеширования
  3. В преобразователе преобразуйте результат метода toString в сущность категории в объект категории.
person Sam1am    schedule 10.12.2014

Вы можете решить с помощью @InitBinder в своем контроллере, например:

@InitBinder
protected void initBinder(WebDataBinder binder) throws Exception{
    binder.registerCustomEditor(Set.class,"categoryList", new CustomCollectionEditor(Set.class){
        protected Object convertElement(Object element){
            if (element instanceof String) {
                Category category = categoryCache.get(Integer.parseInt(element.toString()));
                return role;
            }
            return null;
        }
    });
}
person Arip H    schedule 28.04.2016