I have a Spring boot application with this Gradle build file:
apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'spring-boot' apply plugin: 'war' sourceCompatibility = 1.7 targetCompatibility = 1.7 version = '1.0' buildscript { ext { springBootVersion = '1.1.9.RELEASE' } repositories { maven { url "http://repo.spring.io/libs-snapshot" } mavenLocal() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.9.RELEASE") } } jar { manifest { attributes 'Implementation-Title': 'Server', 'Implementation-Version': version } } war { baseName = 'gs-convert-jar-to-war' version = '0.1.0' } repositories { mavenCentral() maven { url "http://repo.spring.io/libs-snapshot" } maven { url "http://maven.springframework.org/milestone" } } dependencies { compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}") compile("org.springframework.boot:spring-boot-starter-tomcat:${springBootVersion}") compile("org.springframework.boot:spring-boot-starter-actuator:${springBootVersion}") compile("org.springframework.boot:spring-boot-starter-aop:${springBootVersion}") compile("org.springframework.boot:spring-boot-starter-test:${springBootVersion}") compile("org.springframework.boot:spring-boot-starter-security:${springBootVersion}") compile("org.springframework.boot:spring-boot-starter-data-jpa:${springBootVersion}") compile("org.springframework.data:spring-data-rest-webmvc") compile("org.hsqldb:hsqldb") compile("com.google.guava:guava:17.0") compile("org.apache.httpcomponents:httpclient:4.3.4") compile("commons-io:commons-io:2.4") testCompile("junit:junit") }
With this application file:
@EnableAutoConfiguration @Configuration @ComponentScan @Import({ BasicSecurityConfiguration.class, HTTPSTomcatConfiguration.class, MultiPartConfiguration.class }) public class Application extends RepositoryRestMvcConfiguration { public static void main(String[] args) { SpringApplication.run(Application.class, args); }
these configuration files:
@Configuration @EnableWebSecurity public class BasicSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception {
@Configuration public class HTTPSTomcatConfiguration { @Bean EmbeddedServletContainerCustomizer containerCustomizer( @Value("8443") final int port, @Value("keystore.p12") Resource keystoreFile, @Value("tomcat") final String alias, @Value("localhost") final String keystorePass, @Value("PKCS12") final String keystoreType) throws Exception { final String absoluteKeystoreFile = keystoreFile.getFile() .getAbsolutePath(); return new EmbeddedServletContainerCustomizer() { public void customize(ConfigurableEmbeddedServletContainer container) { TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container; tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() { public void customize(Connector connector) { connector.setPort(port); connector.setSecure(true); connector.setScheme("https"); Http11NioProtocol proto = (Http11NioProtocol) connector .getProtocolHandler(); proto.setSSLEnabled(true); proto.setKeystoreFile(absoluteKeystoreFile); proto.setKeyAlias(alias); proto.setKeystorePass(keystorePass); proto.setKeystoreType(keystoreType); } }); } }; } }
@Configuration @EnableConfigurationProperties(MultipartProperties.class) public class MultiPartConfiguration { @Bean public MultipartConfigElement multipartConfigElement() { return new MultipartConfigElement(""); } }
this controller interface:
public interface Controller { @RequestMapping(value = "/t", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public @ResponseBody Test t(@RequestBody Test test); }
and this controller implementation:
@RestController public class ControllerImpl implements Controller { @Override public Test t(Test test) { return test; } }
Everything works fine, except for serializing JSON from client to server. When I execute the curl command:
curl --insecure -H "Authorization: Basic YWRtaW46cGFzcw==" -H "Content-Type: application/json" -X POST -d '{"a":"a","b":"b"}' https://localhost:8443/t
I get:
{"a":null,"b":null}
If I debug only in the controller implementation, I see the fields as null . If I modify the controller as follows:
@Override public Test t(Test test) { Test t = new Test(); t.setA("a"); t.setB("b"); return t; }
I get the correct answer:
{"a":"a","b":"b"}
Why is my application not deserializing the test object properly?