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

springboot中带@NonNull注释的http请求对象字段是否可以在setter方法中访问和操作,而不抛出null指针

卓雅达
2023-03-14

下面是一个HTTP请求对象,它捕获从用户到SpringBoot应用程序的json输入。

package com.bablo.google.request;

import java.io.Serializable;
import java.util.Set;

import javax.validation.constraints.NotNull;

public class SomeRequest implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    @NotNull
    private Long userId;

    private String resNote; //this is not annotated with @NotNull
    @NotNull
    private String revTag;

    public Long getUserId() {
        return userId;
    }

    public void setUserId(final Long userId) {
        this.userId = userId;
    }

    public String getResNote() {
        return responseNote;
    }

    public void setResNote(final String resNote) {
        this.resNote = resNote.trim();    //Call to trim() method of the String object.
    }

    public String getRevTag() {
        return revTag;
    }

    public void setRevTag(final String revTag) {
        this.revTag = revTag.trim();     //Call to the trim() method of the String object.
    }

}

是否可以在setter方法中修剪带有@NotNull验证注释的类的字符串字段?

这里,revTag字段用@NotNull注释,并在setter方法中被修剪,在这种情况下,如果传入的请求对象将null作为revTag值,它会抛出NullPointerException吗?在这种情况下会发生什么?

resNote字段未使用@NotNull进行注释,如果resNote的null值为空,则肯定会引发NullPointerException。

共有2个答案

蒋典
2023-03-14

由于Hibernate的某个版本,因此有可用的方法级验证,注释可以放在方法的正式参数中:

@NotNull
private Long userId;

private String resNote;

...

public String setResNote(@NotNull final String resNote) {
    this.resNote = resNote.trim()
}
萧懿轩
2023-03-14

我们可以安全地在setter方法中修剪,因为如果revTag值不存在于请求中,则与对象本身的绑定将失败。

注意:@有效注释应添加到控制器中的请求处理方法中,以启用数据绑定验证。

控制器下方

@RestController
public class DemoController {

    @GetMapping("/demo/req")
    public ResponseEntity handleSomeGetRequest(@Valid SomeRequest someRequest){
        return ResponseEntity.ok("success");
    }
}


@WebMvcTest(value = DemoController.class)
class DemoControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testNotNullValidation() throws Exception {

        //invoking the endpoint without any request param and this throws BadRequest
        mockMvc.perform(MockMvcRequestBuilders.get("/demo/req"))
                .andExpect(MockMvcResultMatchers.status().isBadRequest());
    }

}

Error in the log trace. 
2020-05-19 22:34:18.509  WARN 9276 --- [    Test worker] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'someRequest' on field 'userId': rejected value [null]; codes [NotNull.someRequest.userId,NotNull.userId,NotNull.java.lang.Long,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [someRequest.userId,userId]; arguments []; default message [userId]]; default message [must not be null]
Field error in object 'someRequest' on field 'revTag': rejected value [null]; codes [NotNull.someRequest.revTag,NotNull.revTag,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [someRequest.revTag,revTag]; arguments []; default message [revTag]]; default message [must not be null]]
 类似资料:
  • 是否可以在操作中发布IFormCollection和Object? 我尝试从Angular向WebAPI发出post请求,请求是上传文件和模型的组合。 角度代码: 如何实现这个WebAPI? 更新:我正在考虑将所有内容添加到FormCollection中,但这对于解析数据来说是非常糟糕的代码

  • 这个问题现有两种变体: 仅当字段不为空时验证:有条件地处理字符串的解决方案 Hibernate验证-仅在对象不为null时进行验证:唯一的答案演示了该行为,并提示您在手动触发验证时如何处理该行为 我的问题添加了限定符,即在可能为空的对象上使用@Valid时如何执行此操作。 这里的用例是,我们有两个字段,其中一个或另一个需要不为null(包含字段的类上的自定义验证器)。当一个不为null时,我需要它

  • 问题内容: 我继承了在getter / setter上具有@JsonProperty批注的某些位代码。目的是当使用Jackson库序列化对象时,字段具有该特定名称。 当前代码: 现在,对于另一个工具,我还需要使用JsonProperty对该字段进行注释。因此,这将是我更改的代码: 是否有人在字段和获取器/设置器上都使用了相同的注释?我在网上四处张望,却什么也没看见。 我已经编译并运行了代码,但是我

  • 问题内容: 我继承了在getter / setter上具有@JsonProperty批注的某些位代码。目的是当使用Jackson库序列化对象时,字段具有该特定名称。 当前代码: 现在,对于另一个工具,我还需要使用JsonProperty对该字段进行注释。因此,这将是我更改的代码: 是否有人在字段和获取器/设置器上都使用了相同的注释?我在网上四处张望,却什么也没看见。 我已经编译并运行了代码,但是我

  • 问题内容: 在Flask中,需要从服务器端发出POST请求。 假设我们有: 我没有在Flask文档中找到任何特定的东西。有人说是问题所在,但我未能将Flask和。真的有可能吗? 提前致谢! 问题答案: 是的,要发出POST请求,您可以使用,请参阅文档。 但是,我建议改用requests模块。 编辑 : 我建议您重构代码以提取常用功能:

  • 我正在开发一个现有的Java代码库,该代码库使用Guice进行依赖注入。我有一个新的类 Foo,其中包含一个我想注入的成员字段(bar)。喜欢这个: 然而,有两件事: 使用Foo的注射器无法直接进入 客户端希望使用“new”创建Foo 当客户端执行以下操作时,是否仍然可以将Bar注入Foo对象: 我对DI和Guice非常陌生,不太明白如何在不调用injector.createInstance()的