【发布时间】:2021-01-12 11:03:42
【问题描述】:
我需要记录一个接受由此类表示的 JSON 的 API:
public class Message {
@NotNull(message = "Sender cannot be null")
private String sender;
@Pattern(regexp="HI|HELLO",message = "Message can be only 'HI' or 'HELLO'")
private String content;
// Constructor, Getters and Setters..
}
Spring Docs 自动生成以下 sn-p:
.Request fields:
|===
|Path|Type|Constraints|Description
|sender
|String
|Must not be null
|Sender of the message
|content
|String
|Must match the regular expression `HI|HELLO`
|Content of the message
|===
Asciidoctor 使用它在 pdf 中创建表格。但是,在 pdf 中,表格被破坏了(因为管道):
如何在正则表达式中转义管道?
我找到了这个issue,但似乎与另一个项目有关。
这是生成文档的测试类(JUnit5):
@WebMvcTest(HomeController.class)
@AutoConfigureRestDocs(outputDir = "target/snippets")
public class HomeControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void postMessageTest() throws Exception {
ConstrainedFields constrainedFields = new ConstrainedFields(Message.class);
this.mockMvc
.perform(post("/message").content("{\"sender\":\"Marc\",\"content\":\"HI\"}")
.characterEncoding("utf-8")
.contentType(MediaType.APPLICATION_JSON))
.andDo(print()).andExpect(status().isOk())
.andDo(document("home-message", requestFields(
attributes(key("title").value("Request fields:")),
constrainedFields.withPath("sender").description("Sender of the message"),
constrainedFields.withPath("content").description("Content of the message")
)));
}
private static class ConstrainedFields {
private final ConstraintDescriptions constraintDescriptions;
ConstrainedFields(Class<?> input) {
this.constraintDescriptions = new ConstraintDescriptions(input);
}
private FieldDescriptor withPath(String property) {
return fieldWithPath(property).attributes(key("constraints").value(
// Let's assume there is only one constraint for each property
constraintDescriptions.descriptionsForProperty(property).get(0)));
}
}
}
重现该问题的完整项目是here。
【问题讨论】: