当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Boot应用程序中从HTTP POST请求生成POJO

燕正卿
2023-03-14

我有一个Angular 2服务,可以将登录数据发布到Spring Boot

登录请求正文:

{"_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>

t记录的唯一异常是由我实现的Spring Security的UserDetailsService引发的UsernameNotFoundException。使用调试器,我可以手动解析请求中的值,并将这些值设置到POJO中。完成此操作后,请求完成,因此问题显然处于解组阶段。

如有任何想法或建议,将不胜感激。

共有1个答案

沈飞舟
2023-03-14

这是因为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
}

请查看jackson-注解项目中的使用构造函数或工厂方法部分。

更新您的请求映射方法,指定它使用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);
    }
}
 类似资料:
  • 对传递的 URL 发出一个 POST 请求。 使用 XMLHttpRequest web api 对给定的url 发出一个 post 请求。 用 setRequestHeader 方法设置 HTTP 请求头的值。 通过调用给定的 callback 和 responseText 来处理 onload 事件。 通过运行提供的 err 函数,处理onerror事件。 省略第三个参数 data ,不发送数

  • 我有Kafka Streams java应用程序启动并运行。我试图使用KSQL创建简单的查询,并使用Kafka流来实现复杂的解决方案。我希望将KSQL和Kafka流作为Java应用程序运行。 我打算通过https://github.com/confluentinc/ksql/blob/master/ksqldb-examples/src/main/java/io/confluent/ksql/em

  • 更新:为了给你更多的上下文,我计划通过使用PhoneGap将chrome扩展即时音乐移植到Android应用程序中。一些在PC上允许的YouTube视频在手机上不允许,我怀疑这是因为Android应用程序中嵌入的YouTube player没有引用者标题。我正试图找到一个解决这个问题的办法,这样我就可以在手机上播放这样的视频了。

  • 我在swift 3中有一个项目,想提出一个GET请求。然而,Alamofire还没有更新到swift 3。何时Alamofire将支持swift 3以及如何用swift 3中的参数硬编码GET请求?

  • 我试图使用新的SpringBoot2 Reactive WebClient类(它没有批处理endpoint)对同一个rest服务进行并行(批处理)调用。例如,我需要100个“comment”对象(ids为1...100),我正在执行以下并行调用: 我是Spring WebFlux的新手,我不确定这是否是用WebClient进行并行调用的正确方法 > 有没有更好(更合适)的方法来做这件事(即做一个单

  • 要获取请求URL,可以在堆栈溢出中找到以下方法。 第一种方法: 第二种方法: 第三种方法: 我不知道在spring boot应用程序中使用哪一个来获取请求URL。 如果我使用第三种方法,那么我是否需要在配置类中创建RequestContextListener的bean,如下所示?