如何在Spring MVC Web应用程序中注册格式化程序?

时间:2014-09-16 05:45:27

标签: java spring spring-mvc web-applications formatter

我在模型属性中绑定嵌套对象时遇到了问题。我有一个类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>

2 个答案:

答案 0 :(得分:2)

mvc.xml文件中有两个部分。

  1. 添加bean converion服务bean:
  2. <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>

    1. 在注释驱动标记中引用此bean。
    2. <mvc:annotation-driven conversion-service="conversionService" />

      大部分时间使用ID都可以。但是,在表单中,它会强制Spring使用null Id而不是null对象创建一个空对象。

答案 1 :(得分:0)

我从Spring 3.1 Form and List BindingJava - 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>