【问题标题】:Escape pipe symbol in Spring REST DocsSpring REST Docs 中的转义管道符号
【发布时间】: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

【问题讨论】:

    标签: java spring springdoc


    【解决方案1】:

    可能不是最好的解决方案,但是,在做了一些研究之后,我发现一个简单的\ 字符足以转义asciidoctor 文档(source)中的管道字符。我们的目标是在.adoc sn-p:

    |Must match the regular expression `HI\|HELLO`
    

    这是在您的代码中提取“约束描述”的方法:

    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)));
    }
    

    在这里,我们可以“完全控制”.adoc 中写入的文本。例如,我们可以从constraintDescriptions.descriptionsForProperty(property) 中获取约束描述,应用我们的转义,然后将转义的字符串传递给.value()

    private FieldDescriptor withPath(String property) {
        // Let's assume there is only one constraint for each property
        String desc = constraintDescriptions.descriptionsForProperty(property).get(0);
        desc = desc.replace("|", "\\|");
        return fieldWithPath(property).attributes(key("constraints").value(desc));
    }
    

    这将在.adoc 中生成转义行,并将在.pdf 中正确呈现:

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      相关资源
      最近更新 更多