Spring MVC:无法将String类型的值转换为属性' category'的所需类型Category。

时间:2017-09-02 18:38:59

标签: java hibernate jsp spring-mvc

我有一个名为Project的类,它有一个属性类别。 Project和Category类有一对多的关系。

public class Project {
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name="category_id")
  private Category category;

public class Category {
  @OneToMany(fetch=FetchType.LAZY, mappedBy="category")
  private Set<Project> project = new HashSet<Project>(0); 

在我的JSP中,我有一个下拉列表,我在其中选择特定项目的类别

 <select class="form-control" name="category" >
   <c:forEach items="${categoriesList}" var="category">
   <option value="${category.id}"><c:out value="${category.category_name}" /></option>
   </c:forEach>
 </select>

我的控制器看起来像是

@RequestMapping(value = "/client/post_project", method = RequestMethod.POST)
  public String postProject(@ModelAttribute("project") Project p){
    projectService.addProject(p);
    return "/client/project";
}

我试图添加一个项目,但我一直有这个错误。谁能告诉我我做错了什么?

Field error in object 'project' on field 'category': rejected value [3]; 
codes [typeMismatch.project.category,typeMismatch.category,typeMismatch.model.Category,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [project.category,category]; arguments []; default message [category]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'model.Category' for property 'category'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [model.Category] for property 'category': no matching editors or conversion strategy found]

1 个答案:

答案 0 :(得分:0)

这个想法很简单。您将必须做两件事。

  1. 您将必须创建一个实现org.springframework.core.convert.converter.Converter<S, T>的类,其中S(源)是您在表单中提到的java.lang.String
  

<option value="${category.id}">

,T(目标)为Category。转换器接口具有一种必须实现的抽象方法。

T convert(S source);

在实现中,您必须提供将源对象转换为Category的逻辑。可能是您的@Repository类需要一点帮助。

  1. 此后,您将必须在WebMVC配置类中注册此转换器,该类很可能是extends WebMvcConfigurationSupport。您将必须@OverrideaddFormatters方法并在那里注册您的转换器。

所以会像

转换器类的实现

@Component
public Class StringToCategoryConverter implements Converter<String, Category> {

  @AutoWired
  private CategoryRepository repository;

  @Override
  public Category convert(final String source) {
    return repository.getCategoryById(source);
  }
}

注册也是必需的,您需要在通常扩展WebMvcConfigurationSupport的类中进行注册。她的父亲。

@Component
@EnableSpringDataWebSupport
public class WebMvcConfig extends WebMvcConfigurationSupport {

  @Override
  public void addFormatters(FormatterRegistry registry) {
       registry.addConverter(stringToCategoryConverter());
       super.addFormatters(registry);
  }

  @Bean 
  public StringToCategoryConverter stringToCategoryConverter(){
       return new StringToCategoryConverter();
  }
}

希望它能对您有所帮助。