Java 杰克逊';s Access.WRITE_仅在测试期间为空

Java 杰克逊';s Access.WRITE_仅在测试期间为空,java,rest,testing,spring-boot,jackson,Java,Rest,Testing,Spring Boot,Jackson,我目前正在使用Jackson的反序列化功能,遇到了一个问题,我不知道如何解决 在我的测试期间,@JsonProperty(access=JsonProperty.access.WRITE_ONLY)注释被忽略,它只显示null。 然而,对于邮递员来说,一切都按预期进行 我只使用了一个带有Web Starter和Test Starter依赖性的Spring启动程序 示例代码: @SpringBootApplication public class DemoApplication { pu

我目前正在使用Jackson的反序列化功能,遇到了一个问题,我不知道如何解决

在我的测试期间,
@JsonProperty(access=JsonProperty.access.WRITE_ONLY)
注释被忽略,它只显示
null
。 然而,对于邮递员来说,一切都按预期进行

我只使用了一个带有Web Starter和Test Starter依赖性的Spring启动程序

示例代码:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

@RestController
class JacksonExampleRestController {

    @PostMapping("/api")
    public void getResti(@RequestBody JacksonModel jacksonModel) {
        System.out.println(jacksonModel.getId());
        System.out.println(jacksonModel.getPassword());
    }
}

class JacksonModel {

    private String id;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
测试:


这是默认行为吗?我是否必须在测试中配置某些内容,还是我现在看不到的其他内容?

为ObjectMapper添加行:

mapper.disable(MapperFeature.USE_ANNOTATIONS);

忽略所有注释可能会有问题。要处理更精细的配置,您可以实现自定义的
JacksonAnnotationInterspector

public class IgnoreJacksonWriteOnlyAccess extends JacksonAnnotationIntrospector {

    @Override
    public JsonProperty.Access findPropertyAccess(Annotated m) {
        JsonProperty.Access access = super.findPropertyAccess(m);
        if (access == JsonProperty.Access.WRITE_ONLY) {
            return JsonProperty.Access.AUTO;
        }
        return access;
    }
}
然后,在实例化映射器之后:

mapper.setAnnotationIntrospector(new IgnoreJacksonWriteOnlyAccess());

我有同样的问题,类似的设置。问题在于测试输入数据。基本上,
writeValueAsBytes()
将完全按照注释的指示进行序列化时忽略密码


请注意,
Access.WRITE_ONLY
基本上是“SetterOnly”或“deserialization ONLY”的意思,而不是相反的意思。

如果不运行代码,我的第一反应是查看您正在使用Jackson使用测试对象生成JSON字节的事实。可能会打印出
convertObjectToJsonBytes
返回的值,并检查json字符串是否正常?检查方法后,它只返回Id。因此我添加了
mapper.configure(MapperFeature.USE_ANNOTATIONS,false)并且它可以工作。。。这个干净吗?因为它感觉不对……我会继续使用HashMap来生成JSON。所以,如果你仔细想想,你正在测试的是端点。无论谁访问这个端点都不会使用您的模型对象,那么为什么要在测试中使用它们呢?我知道这很方便,但不使用相同的对象生成请求可能更安全。
mapper.setAnnotationIntrospector(new IgnoreJacksonWriteOnlyAccess());