我在模型属性中绑定嵌套对象时遇到了问题。我有一个类Book,其中我有嵌套类Subject,如下所示:
@Entity
@Table(name = "book")
public class Book {
// Other properties...
// With all getter setter..
@ManyToOne
@JoinColumn(name="subject_id",nullable=false)
@NotBlank(message = "Please select subject")
private Subject subject;
// Getter setter of subject;
}
我也为Subject实现了Formatter类,如下所示:
@Component
public class SubjectFormatter implements Formatter<Subject>{
@Autowired
SubjectService subjectService;
@Override
public String print(Subject object, Locale locale) {
return object.getName();
}
@Override
public Subject parse(String id, Locale locale) throws ParseException {
return subjectService.getSubject(id);
}
}
并在spring配置中添加了格式化程序:
@EnableWebMvc
@Configuration
@PropertySource(value = { "classpath:application.properties" })
@ComponentScan(basePackages = "com.vbera.main")
@EnableJpaRepositories(basePackages = "com.vbera.main")
public class SpringConfiguration extends WebMvcConfigurerAdapter {
//Other bean definitions...
@Bean(name="conversionService")
public FormattingConversionService conversionService() {
FormattingConversionServiceFactoryBean bean = new FormattingConversionServiceFactoryBean();
bean.setRegisterDefaultFormatters(false);
bean.setFormatters(getFormatters());
return bean.getObject();
}
private Set<Formatter> getFormatters() {
Set<Formatter> converters = new HashSet<Formatter>();
converters.add(new SubjectFormatter());
return converters;
}
}
我仍然在提交时遇到以下异常:
Failed to convert property value of type java.lang.String to required type com.vbera.main.pojo.Subject for property subject
主题列表呈现的JSP视图:
<form:label path="subject" for="subject">Subject</form:label>
<form:select path="subject" class="form-control input-md">
<form:option value="">--- Select ---</form:option>
<form:options items="${subjectList}" itemLabel="name"
itemValue="id" />
</form:select>
答案 0 :(得分:2)
mvc.xml文件中有两个部分。
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<set>
<ref bean="MyFormatter1" />
<ref bean="MyFormatter2" />
</set>
</property>
<property name="converters">
<set>
<ref bean="MyConverter1" />
<ref bean="MyConverter2" />
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService" />
大部分时间使用ID都可以。但是,在表单中,它会强制Spring使用null Id而不是null对象创建一个空对象。
答案 1 :(得分:0)
我从Spring 3.1 Form and List Binding,Java - SpringMVC - Get parameter in the controller链接中找到了解决方案。
在一个答案中,建议在jsp下面选择标签:
<form:select path="subject.id" class="form-control input-md">
<form:option value="">--- Select ---</form:option>
<form:options items="${subjectList}" itemLabel="name"
itemValue="id" />
</form:select>