Browse Source

Merge pull request #15375 from thingsboard/fix/openapi-spec

Strip @JsonIgnoreProperties from schema context and remove CalculatedField pre-registration
pull/15376/head
Viacheslav Klimov 6 months ago
committed by GitHub
parent
commit
f13d4daed3
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 21
      application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java

21
application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.config; package org.thingsboard.server.config;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
@ -63,13 +64,13 @@ import org.springframework.http.HttpStatus;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.ai.model.chat.AiChatModelConfig; import org.thingsboard.server.common.data.ai.model.chat.AiChatModelConfig;
import org.thingsboard.server.common.data.cf.CalculatedField;
import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
import org.thingsboard.server.exception.ThingsboardCredentialsExpiredResponse; import org.thingsboard.server.exception.ThingsboardCredentialsExpiredResponse;
import org.thingsboard.server.exception.ThingsboardErrorResponse; import org.thingsboard.server.exception.ThingsboardErrorResponse;
import org.thingsboard.server.service.security.auth.rest.LoginRequest; import org.thingsboard.server.service.security.auth.rest.LoginRequest;
import org.thingsboard.server.service.security.auth.rest.LoginResponse; import org.thingsboard.server.service.security.auth.rest.LoginResponse;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@ -297,6 +298,19 @@ public class SwaggerConfiguration {
@Lazy(false) @Lazy(false)
ModelConverter mapAwareConverter() { ModelConverter mapAwareConverter() {
return (type, context, chain) -> { return (type, context, chain) -> {
// Strip field-level @JsonIgnoreProperties from context annotations so it
// doesn't pollute the global schema. The OpenAPI schema should show all
// properties; field-level ignore is a serialization concern only.
Annotation[] ctxAnnotations = type.getCtxAnnotations();
if (ctxAnnotations != null) {
Annotation[] filtered = Arrays.stream(ctxAnnotations)
.filter(a -> !(a instanceof JsonIgnoreProperties))
.toArray(Annotation[]::new);
if (filtered.length != ctxAnnotations.length) {
type.ctxAnnotations(filtered);
}
}
JavaType javaType = Json.mapper().constructType(type.getType()); JavaType javaType = Json.mapper().constructType(type.getType());
if (javaType != null) { if (javaType != null) {
Class<?> cls = javaType.getRawClass(); Class<?> cls = javaType.getRawClass();
@ -359,11 +373,6 @@ public class SwaggerConfiguration {
.addSchemas("ThingsboardErrorResponse", ModelConverters.getInstance().readAllAsResolvedSchema(new AnnotatedType().type(ThingsboardErrorResponse.class)).schema) .addSchemas("ThingsboardErrorResponse", ModelConverters.getInstance().readAllAsResolvedSchema(new AnnotatedType().type(ThingsboardErrorResponse.class)).schema)
.addSchemas("ThingsboardCredentialsExpiredResponse", ModelConverters.getInstance().readAllAsResolvedSchema(new AnnotatedType().type(ThingsboardCredentialsExpiredResponse.class)).schema) .addSchemas("ThingsboardCredentialsExpiredResponse", ModelConverters.getInstance().readAllAsResolvedSchema(new AnnotatedType().type(ThingsboardCredentialsExpiredResponse.class)).schema)
.addSchemas("ThingsboardErrorCode", errorCodeSchema) .addSchemas("ThingsboardErrorCode", errorCodeSchema)
// Pre-register types referenced with @JsonIgnoreProperties on fields
// (e.g. CalculatedField via EntityExportData.calculatedFields) to prevent
// field-level ignore lists from polluting the global schema when resolution
// order varies.
.addSchemas("CalculatedField", ModelConverters.getInstance().readAllAsResolvedSchema(new AnnotatedType().type(CalculatedField.class)).schema)
.addSchemas("AiChatModelConfig", ModelConverters.getInstance().readAllAsResolvedSchema(new AnnotatedType().type(AiChatModelConfig.class)).schema); .addSchemas("AiChatModelConfig", ModelConverters.getInstance().readAllAsResolvedSchema(new AnnotatedType().type(AiChatModelConfig.class)).schema);
} }

Loading…
Cancel
Save