Maven 如何在Spring引导应用程序中从HTTP POST请求生成POJO
我有一个Maven 如何在Spring引导应用程序中从HTTP POST请求生成POJO,maven,spring-mvc,jackson,unmarshalling,Maven,Spring Mvc,Jackson,Unmarshalling,我有一个Angular 2服务,它将登录数据发布到Spring Boot@RestContoller 登录请求正文: {"_username": "test", "_password": "test"} Rest控制器: @RestController public class AuthControl { @Autowired AuthenticationService authenticationService; @RequestMapping(value = "/
Angular 2
服务,它将登录数据发布到Spring Boot
@RestContoller
登录请求正文:
{"_username": "test", "_password": "test"}
Rest控制器:
@RestController
public class AuthControl {
@Autowired
AuthenticationService authenticationService;
@RequestMapping(value = "/someurl", method = RequestMethod.POST)
public LoginDto authenticate(HttpServletResponse response, LoginRequestDto requestDto) throws IOException, JSONException {
return authenticationService.authenticate(requestDto, response);
}
}
Jackson将请求解组到该POJO中
public class LoginRequestDto {
private String _username;
private String _password;
public LoginRequestDto() { }
public LoginRequestDto(String u, String p) {
this._username = u;
this._password = p;
}
// getters and setters
}
但是,当Jackson解组POJO时,字段值设置为null,而不是“test”/“test”。因此,登录尝试失败,并显示错误的凭据消息。我想知道我是否丢失了一个库或导致这些字段设置不正确的东西
来自pom.xml的依赖项
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency><!-- implements Thymeleaf HTML5 parsing -->
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-json-org</artifactId>
<version>2.4.0</version>
</dependency>
</dependencies>
org.springframework.boot
spring启动程序父级
1.5.1.1发布
org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
弹簧启动安全
org.springframework.boot
弹簧启动机tomcat
假如
org.springframework.boot
spring引导启动器数据jpa
org.springframework.boot
弹簧启动装置
net.sourceforge.nekohtml
内科特米尔
1.9.22
com.fasterxml.jackson.datatype
jackson数据类型json-org
2.4.0
t记录的唯一异常是由我实现的Spring Security的UserDetails服务引发的UsernameNotFoundException。使用调试器,我可以手动解析请求中的值,并将这些值设置到POJO中。完成此操作后,请求完成,因此问题显然处于解组阶段
如有任何想法或建议,将不胜感激 这是由于Jackson在反序列化时默认使用默认构造函数造成的。您需要使用@JsonCreator
注释让jackson知道您要使用的构造函数是哪个,使用@JsonProperty
注释让它知道如何将参数与json属性绑定
public class LoginRequestDto {
private String _username;
private String _password;
public LoginRequestDto() { }
@JsonCreator
public LoginRequestDto(@JsonProperty("_username") String u,
@JsonProperty("_password") String p) {
this._username = u;
this._password = p;
}
// getters and setters
}
使用构造器或工厂方法查看下一节
更新您的请求映射方法,指定它使用json,并将@RequestBody注释添加到方法参数中
@RestController
public class AuthControl {
@Autowired
AuthenticationService authenticationService;
@RequestMapping(value = "/someurl", method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_VALUE })
public LoginDto authenticate(HttpServletResponse response, @RequestBody LoginRequestDto requestDto) throws IOException, JSONException {
return authenticationService.authenticate(requestDto, response);
}
}
谢谢你的意见。我按照建议添加了注释,但没有成功。没有更改,仍在调用默认构造函数。注释掉默认构造函数揭示了Spring创建POJO参数的原因。唯一的选择是自定义反序列化器吗?@TheHeadRush“Spring创建POJO”是什么意思?它应该会起作用。您不需要为此定制反序列化程序,它非常基本。您使用的是旧版本的jackson数据类型son org。包括jackson core、jackson数据绑定和jackson注释的依赖项(v2.8.6)。当您执行请求时,您的方法是否被命中?您正在设置内容类型标题吗?Spring似乎认为它不必转换请求主体当我说“Spring创建POJO”时,我的意思是故意失败POJO实例化(通过注释掉默认构造函数)会导致堆栈跟踪不包含引用Jackson的帧。更新了jackson数据类型son org的依赖项。在三个Jackson JAR的v2.8.6中添加了显式依赖项。命中预期的控制器方法,内容类型头设置为“application/json”。我很困惑。添加consumes参数和@RequestBody注释解决了这个问题。不确定为什么需要附加注释,但这与问题无关。谢谢你的帮助@默认情况下,如果不使用RequestBody Spring,Headlush将尝试将参数的属性与模型中的请求参数或对象绑定,因此如果发送html表单或使用类似/someurl?\u username=xx&\u password=xx的url,则不能包含该注释。通过RequestBody,您让Spring知道它需要将参数与有效负载中的对象绑定。我希望你能得到它。