Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring @RequestBody Override

I have a Spring controller that takes posts and it works. The only problem is that our SMS providers will be sending us headers that contain keys with a capitalized first letter, for example:

 {
"FromPhoneNumber":"15177754077",
"ToPhoneNumber":"17572046106",
"ResponseReceiveDate":"7/29/2014 5:25:10 AM",
"Message":"PIN 1234"
}

Spring will throw an error like:

    Could not read JSON: Unrecognized field "FromPhoneNumber" (class com.talksoft.spring.rest.domain.CDynePost), not marked as ignorable (4 known properties: "responseReceiveDate", "toPhoneNumber", "fromPhoneNumber", "message"])

So, there must be a way for me to override this behavior. Here is the controller method that handles the CDyne posts:

    @RequestMapping(method = RequestMethod.POST, value="/celltrust")
    public ResponseEntity<String> cellTrustPost(@RequestBody CDynePost cDynePost) {
        String message = "FAILED";
        UserInteraction userInteraction = getUserInteraction(cDynePost);
        boolean success = someSpringService.logMessage(userInteraction);

        if (success) {
            message = "OK";
            return new ResponseEntity<String>(message, HttpStatus.ACCEPTED);
        } else {
            return new ResponseEntity<String>(message, HttpStatus.FAILED_DEPENDENCY);
        }       

    }

and here is the CDynePost class:

public class CDynePost {
    private String FromPhoneNumber;
    private String ToPhoneNumber;
    private String ResponseReceiveDate;
    private String Message;

    public String getFromPhoneNumber() {
        return FromPhoneNumber;
    }
    public void setFromPhoneNumber(String FromPhoneNumber) {
        this.FromPhoneNumber = FromPhoneNumber;
    }
    public String getToPhoneNumber() {
        return ToPhoneNumber;
    }
    public void setToPhoneNumber(String ToPhoneNumber) {
        this.ToPhoneNumber = ToPhoneNumber;
    }
    public String getResponseReceiveDate() {
        return ResponseReceiveDate;
    }
    public void setResponseReceiveDate(String ResponseReceiveDate) {
        this.ResponseReceiveDate = ResponseReceiveDate;
    }
    public String getMessage() {
        return Message;
    }
    public void setMessage(String Message) {
        this.Message = Message;
    }
}   

I've looked at ObjectMapper but I am not sure how to work this into my controller, and truth be told I'd prefer not to have to write a bunch of extra classes if Spring will do it for free.

like image 630
JonasJSchreiber Avatar asked Sep 01 '14 20:09

JonasJSchreiber


1 Answers

Simply annotate your field, getter, or setter with @JsonProperty, specifying the exact name that will appear in the JSON. For example

@JsonProperty("FromPhoneNumber")
private String FromPhoneNumber;
like image 101
Sotirios Delimanolis Avatar answered Sep 20 '22 06:09

Sotirios Delimanolis