Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven 如何在Spring引导应用程序中从HTTP POST请求生成POJO_Maven_Spring Mvc_Jackson_Unmarshalling - Fatal编程技术网

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知道它需要将参数与有效负载中的对象绑定。我希望你能得到它。