2017-03-11 5 views
1

ich gelernt, wie Json und java.util.Optional zusammen durch diesen Beitrag zu verwenden: https://medium.com/@harittweets/how-to-use-java-util-optional-and-json-together-12434f9d55b9#.r0kpo65f8@JsonFormat auf Optional Eigenschaft

Aber ich habe ein anderes Problem, wenn die Eigenschaft der Klasse in Typ Datum ist, und es muss sein formatiert. So verwende ich @JsonFormat:

public class UserBean extends BasicBean { 

    private String username; 

    private String password; 

    @JsonFormat(pattern = "yyyy-MM-dd") 
    private Optional<Date> dob; 

    // getter and setter 
} 

Ich benutze Frühling Boot für meine App, das ist die Konfiguration:

@SpringBootApplication 
@EnableAutoConfiguration 
@ComponentScan("com.hag.prj") 
public class Application{ 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 


@Configuration 
public class ApplicationConfig { 

    @Bean 
    @Primary 
    public ObjectMapper objectMapper() { 
     return Jackson2ObjectMapperBuilder.json().serializationInclusion(JsonInclude.Include.NON_NULL) 
       .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) 
       .modules(this.jdk8Module(), this.jsrModule(), this.parameterNamesModule()).build(); 
    } 

    @Bean 
    public Module jdk8Module() { 
     final Jdk8Module jdk8Module = new Jdk8Module(); 
     jdk8Module.configureAbsentsAsNulls(true); 
     return jdk8Module; 
    } 

    @Bean 
    public Module jsrModule() { 
     return new JavaTimeModule(); 
    } 

    @Bean 
    public Module parameterNamesModule() { 
     return new ParameterNamesModule(); 
    } 
} 

@RestController 
@RequestMapping("/user") 
public class UserController { 

    @RequestMapping(method = RequestMethod.POST) 
    public ResponseEntity<UserBean> create(UserBean userBean){ 
     return ResponseEntity.ok(userBean); 
    } 

} 

Ich benutze erweiterte REST-Client zu testen, ist die Konfiguration wie folgt: enter image description here

Das Ergebnis sieht wie folgt aus:

{ 
    timestamp: "2017-03-12T23:22:20.237+0000" 
    status: 400 
    error: "Bad Request" 
    exception: "org.springframework.validation.BindException" 
    errors: [1] 
     0: { 
     codes: [4] 
      0: "typeMismatch.userBean.dob" 
      1: "typeMismatch.dob" 
      2: "typeMismatch.java.util.Optional" 
      3: "typeMismatch" 
     arguments: [1] 
      0: { 
       codes: [2] 
        0: "userBean.dob" 
        1: "dob" 
       defaultMessage: "dob" 
       code: "dob" 
      } 
     defaultMessage: "Failed to convert property value of type 'java.lang.String' to required type 'java.util.Optional' for property 'dob'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@com.fasterxml.jackson.annotation.JsonFormat java.util.Date] for value '1988-10-07'; nested exception is java.lang.IllegalArgumentException" 
     objectName: "userBean" 
     field: "dob" 
     rejectedValue: "1988-10-07" 
     bindingFailure: true 
     code: "typeMismatch" 
     } 
    message: "Validation failed for object='userBean'. Error count: 1" 
    path: "/user" 
} 

Ho w kann ich dieses Problem lösen

+0

haben Sie diese auf den Klassenpfad? (maven deps) https://github.com/FasterXML/jackson-modules-java8 – Eugene

+0

@Eugene Ja, ich habe – gianglaodai

+0

ok ... funktioniert es dann für andere optionals? von einem anderen Typ als 'java.util.Date' – Eugene

Antwort

0

Versuchen mit:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd") 
Verwandte Themen