我的应用程序中有一些相互关联的实体,并且有一些表单可供用户设置这些关系。举个简单的例子,我将使用“父票证”的概念:
@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
我的格式化程序失败了吗?我该如何解决这个看似鸡蛋问题?
答案 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
。