Comment puis-je afficher une interface utilisateur conviviale d'erreur quand le Printemps est dans l'incapacité de valider un modèle de java.util.Champ Date?
Je suis en utilisant le Printemps 3.1.2.La LIBÉRATION. Je veux afficher un message d'erreur sur ma page JSP, si mon champ de date n'est pas correctement formaté. J'ai pensé que j'avais suivi toutes les étapes. Je liant un convertisseur dans mon contrôleur ...
@InitBinder
public void initBinder(final WebDataBinder binder) {
final DateFormat dateFormat = new SimpleDateFormat(Contract.DATE_FORMAT);
dateFormat.setLenient(false);
//true passed to CustomDateEditor constructor means convert empty String to null
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
...
}
J'ai inclus ces messages d'erreur dans mes messages.fichier de propriétés (inclus dans le Ressort de contexte de l'application)
typeMismatch.activationDate=The activation date format should be of the form MM/dd/yyyy
typeMismatch.sampleUserForm.activationDate=The activation date format should be of the form MM/dd/yyyy
Voici le modèle que j'utilise:
public class SampleUserForm
{
private String userId;
private String firstName;
private String middleName;
private String lastName;
private String username;
private String url;
private String password;
private String confirmPassword;
private State state;
private java.util.Date activationDate;
private java.util.Date expirationDate;
private List<Product> products;
private Set<Role> roles = new HashSet<Role>();
Et voici le message d'erreur que je reçois lorsque je soumettre mon formulaire avec un mal-date formatée ...
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'sampleUserForm' on field 'activationDate': rejected value [1900]; codes [typeMismatch.sampleUserForm.activationDate,typeMismatch.activationDate,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [sampleUserForm.activationDate,activationDate]; arguments []; default message [activationDate]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'activationDate'; nested exception is java.lang.IllegalArgumentException: Could not parse date: Unparseable date: "1900"]
org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:111)
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75)
org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:156)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
Quoi d'autre dois-je faire/vérifier pour piège pour un mal-date formatée? Je préfère affiche un message d'erreur convivial pour l'utilisateur, plutôt que la page gracelessly en train de mourir.
Ici est la méthode de contrôleur qui est censé s'occuper de la forme. Remarque que j'ai déjà inclus un BindingResult.
@RequestMapping(value = "/save", method = RequestMethod.POST)
public ModelAndView save(final HttpServletRequest request,
final SampleUserForm sampleUserForm,
final Model model,
final BindingResult result)
{
String nextPage = "sampleusers/add";
m_sampleUserFormValidator.validate(sampleUserForm, result);
if (!result.hasErrors())
{
... process the model and determine the next page ...
} //if
return new ModelAndView(nextPage);
}
OriginalL'auteur Dave | 2013-03-25
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous devez être de liaison de la forme dans l'un de vos
POST
méthodes à l'aide de@ModelAttribute
. Dans la même méthode de lier unBindingResult bindingResult
et toutes les erreurs de liaison doivent être saisis dans cebindingResult
objet. À l'intérieur de la méthode, vous devriez être en mesure de vérifier pourif (bindingResult.hasErrors()) {
et de prendre les mesures appropriées.
L'ajout de la BindingResults que le paramètre suivant après l'une annotée avec @ModelAttribute dans votre contrôleur méthode résout le problème, exactement comme Teja décrites. Sans la liaison résultats, le printemps lance l'exception. Avec la liaison résultats, il vous donnera une chance de réagir sur les problèmes.
Salut, Le BindingResult était déjà dans la méthode de contrôleur. J'ai inclus le contrôleur de la signature de la méthode en question. D'autres types de messages d'erreur sont affichés en arrière amende, c'est que ces conversions de dates qui sont à jeter les exceptions.
OriginalL'auteur Teja Kantamneni
Voir: Printemps @Valide validateur pas appelé correctement (Roo, Hibernate).
Courte histoire est en train de changer le contrôleur de la signature de la méthode de
à
fixe tout.
OriginalL'auteur Dave
Je crois que l'erreur est lorsque vous formats de données. Pour confirmer que vous avez besoin de déboguer votre application et vérifiez la date de valeur. Et une autre bonne pratique serait de croire que vous configurez un format standard pour votre application.
Suivez l'exemple ci-dessous:
Avec FormattingConversionService vous n'avez pas besoin de convertir les données dans le classeur. Pour rendre cette méthode de travail vous avez juste besoin de créer une classe avec des méthodes et des annotations dans un paquet qui est analysé. Et essayez d'utiliser cet exemple dans votre page JSP: <fmt:formatDate pattern="dd/MM/yyyy" value="${modèle.activationDate}" var="activationDate" />
OriginalL'auteur Tiarê Balbi
annoter une méthode sur ce contrôleur de classe avec cette classe/niveau de la méthode d'annotation:
plus info
OriginalL'auteur Hamid Samani
Vous pouvez voir ce lien pour plus d'
http://forum.springsource.org/showthread.php?58933-Handle-excpetions-from-custom-property-editor-spring-2-5
http://www.codercorp.com/blog/spring/registering-propertyeditorss-with-spring-for-custom-objects-example.html
CustomDateEditor de printemps lance l'analyse d'exception.Donc, après l'exception qu'elle termine.Si le contrôle n'est pas en passant à la vôtre contrôleur.Ce que vous devez faire est de yo besoin de s'étendre PropertyEditorSupport .Dans le vôtre code étendu de ne pas jeter l'exception de l'attraper .
OriginalL'auteur abishkar bhattarai
BindingResult Argument doit être à côté de Modèle en cours de validation. Par exemple
OriginalL'auteur Robin