2015-05-11 13 views
8

io non sono in grado di lasciare questo lavoro:@DateTimeFormat (pattern = "yyyy-MM-dd"), con Spring MVC Resto servizio dà "errore 400 richiesta sintatticamente corretto"

@RequestMapping(value = "/people", method = RequestMethod.GET, produces = "application/json") 
    public @ResponseBody 
    List<IPerson> searchPerson(@RequestParam(value = "birthDay", required = false) @DateTimeFormat(pattern="yyyy-MM-dd") Date birthDay) { 

con la richiesta:

http://localhost:8080/rest/people?birthDay=2014-05-25 

l'errore è sempre:

"HTTP stato 400 - la richiesta inviata dal client era sintatticamente scorretto".

Non riesco a trovare alcuna risorsa che mi dia una risposta/guida chiara per comprendere il problema sottostante ... qualcuno potrebbe aiutarmi? Grazie!

Edit: eccezione è:

Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.util.Date for value '2010-10-10'; nested exception is java.lang.IllegalArgumentException 
    at org.springframework.core.convert.support.ObjectToObjectConverter.convert(ObjectToObjectConverter.java:78) 
    at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:35) 
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:168) 
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:161) 
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:93) 
    at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:61) 

... 40 more 
Caused by: java.lang.IllegalArgumentException 
    at java.util.Date.parse(Date.java:615) 
    at java.util.Date.<init>(Date.java:272) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at org.springframework.core.convert.support.ObjectToObjectConverter.convert(ObjectToObjectConverter.java:73) 
    ... 45 more 
+0

Puoi fare una richiesta di esempio? Se lo chiami dal codice, puoi registrare o intercettare la chiamata? – greyfairer

+0

Hi @greyfairer ha modificato il codice e ha aggiunto la richiesta. Fondamentalmente è la data che sta causando i miei mal di testa ... Grazie! – Paolof76

+0

È possibile aggiungere un gestore di eccezioni personalizzato per visualizzare l'eccezione completa? E.g: @ControllerAdvice public class DefaultExceptionsControllerAdvice estende ResponseEntityExceptionHandler { – greyfairer

risposta

1

Finalmente ho trovato la soluzione, forse potrebbe essere utile per gli altri con lo stesso problema. Basta aggiungere questo metodo per il controllore:

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    dateFormat.setLenient(false); 
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); 
} 

destra nella documentazione: http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-webdatabinder

Ma ancora non capisco perché @DateTimeFormat (modello = "yyyy-MM-dd") non funziona. .. Con questa soluzione non c'è bisogno di DateTimeFormat, così ho annotato il parametro come gli altri:

@RequestParam(required = false) Date birthDay 
2

nel forum primavera they ha detto che è necessario disporre di un servizio di conversione inizializzato nella configurazione al fine di utilizzare il formatterio automatico alleato. Qualcosa di simile:

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"/> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="conversionService" ref="conversionService" /> 
     </bean> 
    </property> 
</bean> 
+0

OK Sono contento di non essere il primo a passare attraverso questo;) Grazie molto utile il link, in quanto mi mostra la logica sottostante (non ben documentata ??), +1 – Paolof76

Problemi correlati