Tho*_*ard 4 java testing rest jackson spring-boot
我目前正在使用 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;
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是默认行为吗?我是否必须在测试中配置某些内容,或者是我现在看不到的其他内容?
忽略所有注释可能会出现问题。要处理更精细的配置,您可以实现您的自定义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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在实例化映射器之后:
mapper.setAnnotationIntrospector(new IgnoreJacksonWriteOnlyAccess());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2909 次 |
| 最近记录: |