example variable names such as, tId
, iPhone
, bLaBlAbLa
, testName
.
Steps to replicate issue
TestModel.java
package com.test.IssueWithName.model;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public class TestModel {
private int tId;
private String iPhone;
private int bLaBlAbLa;
private String testName;
}
TestController.java
package com.test.IssueWithName.controller;
import com.test.IssueWithName.model.TestModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@GetMapping("test")
public TestModel responseNamingIssue() {
return new TestModel(1, "15 ultra super duper pro max", 4, "testingNameIssues bla bla");
}
}
IssueWithNameApplication.java
(main class)
package com.test.IssueWithName;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class IssueWithNameApplication {
public static void main(String[] args) {
SpringApplication.run(IssueWithNameApplication.class, args);
}
}
response while hitting localhost:<port>/test
{
"testName": "testingNameIssues bla bla",
"tid": 1,
"iphone": "15 ultra super duper pro max",
"blaBlAbLa": 4
}
Problem: testName
followed camelCasing rule properly but i guess tId
, iPhone
and bLaBlAbLa
named variables failed camelCasing in response. tId
, iPhone
and bLaBlAbLa
became tid
, iphone
and blaBlAbLa
respectively.
Please correct me if I'm wrong at somewhere. Thanks for reading.
Spring Boot uses Jackson as the default serialization/deserialization library.
For Jackson to serialize a POJO, it looks for default getters (methods with prefix is for boolean, get for the other types) of fields.
The problem you are seeing is due to the fact that Jackson uses Java Bean naming conventions to figure out the the JSON properties in a Java class.
A similar issue has been raised before as well. Please check below mentioned link for more details related to this issue. Why does Jackson 2 not recognize the first capital letter if the leading camel case word is only a single letter long? Coming back to your question you can solve this issue by using @JsonProperty on your fields instead of using Lombok @Getter annotation for generating getter methods. Its a Jackson library annotation you can use to customize your JSON property name. Now your model class will look like this :
@AllArgsConstructor
public class TestModel {
@JsonProperty
private int tId;
@JsonProperty
private String iPhone;
@JsonProperty
private int bLaBlA;
@JsonProperty
private String testName;
}
After making these changes you will get response like this :
{ "tId": 1, "iPhone": "I Phone", "bLaBlA": 8, "testName": "Testing" }
I have tested the above code in my local and its working fine. Hope this helps Happy Coding!