2016-08-19 2 views
1

У меня есть класс Item и класс Category. Класс объекта имеет ссылку на класс категории.Невозможно преобразовать строку в мой пользовательский тип данных Категория

Класс товара выглядит следующим образом.

@Entity 
@Table(name = "ITEMS") 
public class Item { 

@OneToOne 
private Category category; 
    public Category getCategory() { 
     return category; 
    } 

    public void setCategory(Category category) { 
     this.category = category; 
    } 
} 

Категория Класс выглядит следующим образом.

package com.easypos.models; 

import java.io.Serializable; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import javax.validation.constraints.Size; 

@Entity 
@Table(name="category") 
public class Category implements Serializable{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private int id; 
    @Size(min = 2, max = 30) 
    @Column(name = "CATEGORY_NAME", nullable = false) 
    private String categoryName; 
    @Column(name = "CATEGORY_REMARK", nullable = true) 
    private String categoryDescription; 


    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getCategoryName() { 
     return categoryName; 
    } 

    public void setCategoryName(String categoryName) { 
     this.categoryName = categoryName.trim(); 
    } 

    public String getCategoryDescription() { 
     return categoryDescription; 
    } 

    public void setCategoryDescription(String categoryDescription) { 
     this.categoryDescription = categoryDescription; 
    } 



    @Override 
    public String toString() { 
     return this.categoryName; 
    } 



} 

Мои методы контроллера являются

@RequestMapping(value = "/add", method = RequestMethod.GET) 
    public String create(Model model) { 
     item = new Item(); 
     model.addAttribute("title", "Add Item"); 
     model.addAttribute("categories", categoryService.findAll()); 
     model.addAttribute("suppliers", supplierService.findAll()); 
     model.addAttribute(item); 
     return "item/create"; 
    } 

    @RequestMapping(value = "/add", method = RequestMethod.POST) 
    public String savePorduct(Model model, @ModelAttribute("item") @Valid Item item, BindingResult result, 
      RedirectAttributes redirectAttributes) { 
     itemValidator.validate(item, result); 
     if (result.hasErrors()) { 
      model.addAttribute("title", "Add Item"); 
      model.addAttribute("categories", categoryService.findAll()); 
      model.addAttribute("suppliers", supplierService.findAll()); 
      return "item/create"; 
     } 
     redirectAttributes.addFlashAttribute("message", "Item successfully saved."); 
     itemService.saveitem(item); 
     return "redirect:/item/"; 
    } 

В Мой Jsp файл я использовал следующий код для отображения категорий в окне выбора.

имеет-ошибку «> Категории

<div class="col-sm-9"> <sf:select path="category" cssClass="form-control"> <sf:options items='${categories}' itemValue='id'/> </sf:select> <p><sf:errors path="category" /></p> </div> </div>

В Моем Jsp файле, когда я отправить форму, я получаю ошибку, которая говорит„нет соответствия редакторов или преобразование стратегии не нашла“- полный журнал ошибок выглядит следующим образом:

Failed to convert property value of type [java.lang.String] to required type [com.easypos.models.Category] for property category; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.easypos.models.Category] for property category: no matching editors or conversion strategy found 
+0

Я не про такие рамки; но если вы планируете преобразовать String в категорию ... возможно, классу категории нужен хотя бы конструктор, который берет строку? – GhostCat

ответ

0

toString() не поможет вам в этом случае Вы будете нуждаться в PropertyEditor или Formatter или удобст. rter зарегистрирован для преобразования строковых данных в категорию, которую вы отправляете на сервер. Мне нужно посмотреть, как выглядит ваш JSP-файл перед тем, как дать вам пример кода, но this должно быть хорошим местом для начала.

+0

0

Здесь таблица ITEM избыточна. Поскольку класс Item содержит только один атрибут и это взаимно однозначное отношение. Поэтому вам следует избегать этого класса сущности. Еще одна вещь, каждый класс сущности должен иметь первичный ключ с аннотацией @Id.

Очевидно, что класс Item принимает атрибут типа категории и из вашей формы jsp не существует атрибута типа категории. Для примера:

<form action="action_url" method="POST"> 
    <input type="text" name="a"/> 
    <input type="text" name="b"/> 
    <input type="text" name="c"/> 
    <input type="submit" value="Submit"/> 
</form> 

Для этого Jsp формируют ваш классу сущностей/модели должен нравиться,

@Entity 
@Table(name = "CATEGORY") 
public class Category implements Serializable { 

    @Id 
    @GeneratedValue 
    @Column(name = "ID") 
    private Long id; 

    @Column(name = "C_1") 
    private String a; 

    @Column(name = "C_2") 
    private String b; 

    @Column(name = "C_2") 
    private String c; 

    ...Getter and Setter here.... 
} 

Это должно убедиться, что имя элемента формы и модель атрибуты имени одинаково, если вы хотите автоматически свяжите их. Но на вашей странице jsp нет элемента с именем «категория», и вы не можете создать этот тип элемента формы, потому что категория - это определенный пользователем класс, а html не знает этот тип элемента. Надеюсь, вы поняли.

Вы должны использовать объект Category для привязки элементов. Как это:

@RequestMapping(value = "/add", method = RequestMethod.POST) 
public String savePorduct(Model model, @ModelAttribute("category") Category category, BindingResult result) { 
--other logic here-- 
} 

Я надеюсь, что это может решить вашу проблему.

0

Давайте сделаем одно ясно. Если вы хотите связать вложенные поля объекта, вам нужно установить атрибут 'name' вашего элемента html, например name = "object.field" Здесь вы пытаетесь привязать значение вашего элемента select (который является String) до поле категории (это тип типа) в вашем классе Item. Это не сработает.

попробовать

path = "category.categoryName" 

и посмотреть, если он работает.

В любом случае, у вас есть первичный ключ на объекте объекта.

Смежные вопросы