es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Descripción de la propiedad del archivo para swagger @esquema en Spring Boot.

Estoy trabajando en Spring Boot (v2.5.6) con la dependencia openapi-ui (v1.5.2) para Swagger UI. Quiero establecer la descripción y otros atributos, como required, en @schema. El problema es que necesito leer estos valores desde una propiedad (recurso paquete). También quiero leer otros atributos, como min/max/.. desde algunas propiedades.

He intentado el siguiente código pero no ha funcionado:

@Schema(description="{postalCode.description}", required="{postalCode.required}")
String postalCode;

donde postalCode.description es una clave de propiedad en un paquete de recursos.

¿Hay alguna manera de usar un “diccionario” de propiedades para Swagger?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes utilizar un archivo de propiedades similar a un diccionario para Swagger. Una forma de lograr esto es definir un JsonSerializer personalizado para la anotación @Schema que utiliza un ResourceBundle para leer las propiedades. Aquí tienes un ejemplo:

    public class SchemaWithPropertiesJsonSerializer extends JsonSerializer<schema> {
    
        private final ResourceBundle resourceBundle;
    
        public SchemaWithPropertiesJsonSerializer(ResourceBundle resourceBundle) {
            this.resourceBundle = resourceBundle;
        }
    
        @Override
        public void serialize(Schema value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            ObjectNode node = new ObjectMapper().valueToTree(value);
            String descriptionKey = node.get("description").asText();
            String description = resourceBundle.getString(descriptionKey);
            node.put("description", description);
            gen.writeTree(node);
        }
    }
    

    En este ejemplo, el serializador personalizado lee el campo “description” de la anotación @Schema y lo utiliza como una clave para leer la descripción real desde un ResourceBundle. Puedes añadir lógica similar para otros atributos como “required”.

    Para utilizar este serializador personalizado, necesitas registrarlo con el ObjectMapper utilizado por Swagger. Aquí tienes un ejemplo:

    @Configuration
    public class SwaggerConfig {
    
        @Autowired
        private MessageSource messageSource;
    
        @Bean
        public Jackson2ObjectMapperBuilderCustomizer customizer() {
            return builder -> {
                SimpleModule module = new SimpleModule();
                module.addSerializer(new SchemaWithPropertiesJsonSerializer(ResourceBundle.getBundle("ruta/al/archivo/de/propiedades", Locale.getDefault())));
                builder.modules(module);
            };
        }
    
        @Bean
        public OpenAPI customOpenAPI() {
            // configura tu objeto OpenAPI aquí
        }
    }
    

    En este ejemplo, el serializador personalizado se añade al ObjectMapper utilizado por Swagger a través de un Jackson2ObjectMapperBuilderCustomizer. El ResourceBundle se carga desde un archivo de propiedades en “ruta/al/archivo/de/propiedades”, con la configuración regional predeterminada. Puedes personalizar estos valores según tus necesidades.

    Con esta configuración, puedes utilizar la anotación @Schema con claves de propiedades en lugar de valores reales, y el serializador personalizado leerá los valores desde el ResourceBundle en tiempo de ejecución. Aquí tienes un ejemplo:

    @Schema(description = "postalCode.description", required = "postalCode.required")
    private String postalCode;
    

    En este ejemplo, “postalCode.description” y “postalCode.required” son claves en el ResourceBundle que corresponden a la descripción y los valores requeridos reales para el campo postalCode.

Comments are closed.