如何从org.springframework.format.Formatter返回用户友好的错误?

时间:2015-04-27 19:46:05

标签: spring spring-mvc jpa

我的应用程序中有一些相互关联的实体,并且有一些表单可供用户设置这些关系。举个简单的例子,我将使用“父票证”的概念:

@Entity
public class Ticket {
    @Id
    @GeneratedValue
    Integer id;

    @ManyToOne
    private Ticket parentTicket;

    // ...
}

在其他地方,我为Ticket课程定义了Formatter

@Component
public class TicketFormatter implements Formatter<Ticket> {
    // ...

    @Override
    public String print(Ticket object, Locale locale) {
        return object.getId().toString();
    }

    @Override
    public Ticket parse(String text, Locale locale) throws ParseException {
        try {
            return ticketService.getTicket(Integer.valueOf(text));
        } catch (Exception e) {
            throw new IllegalArgumentException("Invalid ticket #"+text, e);
        }
    }
}

最后,我的表单或多或少:

<label for="parentTicket">Parent Ticket:</label>
<input type="text" name="parentTicket" id="parentTicket"/>

我希望用户输入要链接的故障单的ID号,并将空白条目视为null

所以,我希望我的表单上显示的验证错误是“Invalid ticket#[blah]”,但相反,我基本上得到了一个很长的堆栈跟踪......

处理此问题的正确方法是什么?我是否需要实施单独的Validator并将其应用于我的parentTicket字段?但是,这不会验证Ticket,而不是String我的格式化程序失败了吗?我该如何解决这个看似鸡蛋问题?

1 个答案:

答案 0 :(得分:1)

这是我到目前为止遇到的最佳解决方案:Customize Spring Error Message

基本上,我只需要set up a MessageSource

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="/WEB-INF/messages/messages"/>
</bean>

然后在/WEB-INF/messages/messages.properties中设置一些属性,例如:

typeMismatch.com.example.domain.Ticket=is not a valid ticket number

然后将其显示为错误消息。

通过检查Spring MVC为您提供的BindingResult对象,您可以找到有关其工作原理的更多信息,以找到&#34; error codes&#34;。默认情况下,这会使用DefaultMessageCodesResolver