我目前正在使用 Jackson 的反/序列化功能,遇到了一个问题,我不知道如何解决。
在我的测试过程中@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
注释被忽略,它只显示null
。
然而,例如邮递员一切都按预期进行。
我只使用带有 Web Starter 和 Test Starter 依赖项的 Spring Boot Starter。
示例代码:
@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;
}
}
Test:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class DemoApplicationTests {
private MockMvc mockMvc;
@Before
public void setUp() {
JacksonExampleRestController jacksonExampleRestController = new JacksonExampleRestController();
mockMvc = MockMvcBuilders.standaloneSetup(jacksonExampleRestController)
.build();
}
@Test
public void testJackson() throws Exception {
JacksonModel jacksonModel = new JacksonModel();
jacksonModel.setId("id");
jacksonModel.setPassword("password");
mockMvc.perform(post("/api").
contentType(APPLICATION_JSON_UTF8)
.content(convertObjectToJsonBytes(jacksonModel)));
}
public static byte[] convertObjectToJsonBytes(Object object)
throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return mapper.writeValueAsBytes(object);
}
}
这是默认行为吗?我是否必须在测试中配置某些内容,或者是我现在看不到的其他内容?
忽略所有注释可能会出现问题。要处理更精细的配置,您可以实现您的自定义JacksonAnnotationIntrospector
:
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());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)