user3263992
user3263992

Reputation: 53

Spring REST @RequestBody consume (XML or JSON) to POJO without annotations

I am writing a Springboot REST endpoint and want to consume XML or JSON requests for a simple service. In either case I want Spring to construct an @RequestBody pojo WITHOUT annotating any of the POJO. Is this OK? Safe? Performant?

I was reading this which told me about configuration by exception. To me this means if I structure my request to contain the exact name and case as the POJO member variables I want to populate the @RequestBody will be able to create my class SomeRequest.

If this is my REST endpoint:

@RequestMapping(value = GET_FOR_SOMETHING, method = RequestMethod.POST,
        consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE},,
        produces = {MediaType.APPLICATION_JSON_VALUE})
public @ResponseBody
StatusResponse<Boolean> getMpdForReqest(@RequestBody SomeRequest request)

And this is my POJO:

public class SomeRequest {

    String one;
    String two;


    public String getOne() {
        return one;
    }

    public void setOne(String one) {
        this.one = one;
    }

    public String getTwo() {
        return two;
    }

    public void setTwo(String two) {
        this.two = two;
    }
}

My JSON request:

{
"one": "str",
"two": "str"
}

My XML request:

<SomeRequest>
   <one>str</one>
   <two>str</two>
</SomeRequest>

My question is: why should I not do this or is it perfectly fine?

Thank you all.

Upvotes: 0

Views: 3325

Answers (2)

so-random-dude
so-random-dude

Reputation: 16465

TLDR; It is perfectly fine.

Is this OK? Safe? Performant?

Yes, it is as performant as it's annotated cousin, if you take program efficiency into account.

If you take the Programmer efficiency into account, it is much more efficient as the developer doesn't have to deal with a bunch of annotations.

Speaking of Programmer efficiency, I would encourage you to use project Lombok instead of crapping your POJO with bunch of getter and setter methods, that's what cool kids do now a days.

Catch

This will work fine as long as your json fields are one word and small case.

When you have multi-word field name, Java standard is the camelCase and usually JSON standard is the snake_case. In this case, you can either have a Class level Annotation (one per class, so not much ugly). Or, since you are using spring boot, you can use an application wide property (spring.jackson.property-naming-strategy = SNAKE_CASE ).

If you have weird json field names with spaces in between, you might need to use @JsonProperty annotation. Remember, this is a perfectly valid json

{
    "just a name with a space" : "123"
}

Upvotes: 2

KevKosDev
KevKosDev

Reputation: 849

POJO as RequestBody works perfectly fine. Just note that Spring however will return 400 - Bad Request for every request that can not be mapped to the @RequestBody annoted object.

Upvotes: 0

Related Questions