fixed server failure when cf configuration is invalid
This commit is contained in:
		
							parent
							
								
									dfc0183c41
								
							
						
					
					
						commit
						7ba8e1366c
					
				@ -70,7 +70,6 @@ public class DefaultCalculatedFieldCache implements CalculatedFieldCache {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @AfterStartUp(order = AfterStartUp.CF_READ_CF_SERVICE)
 | 
					    @AfterStartUp(order = AfterStartUp.CF_READ_CF_SERVICE)
 | 
				
			||||||
    public void init() {
 | 
					    public void init() {
 | 
				
			||||||
        //TODO: move to separate place to avoid circular references with the ActorSystemContext (@Lazy for tsSubService)
 | 
					 | 
				
			||||||
        PageDataIterable<CalculatedField> cfs = new PageDataIterable<>(calculatedFieldService::findAllCalculatedFields, initFetchPackSize);
 | 
					        PageDataIterable<CalculatedField> cfs = new PageDataIterable<>(calculatedFieldService::findAllCalculatedFields, initFetchPackSize);
 | 
				
			||||||
        cfs.forEach(cf -> {
 | 
					        cfs.forEach(cf -> {
 | 
				
			||||||
            calculatedFields.putIfAbsent(cf.getId(), cf);
 | 
					            calculatedFields.putIfAbsent(cf.getId(), cf);
 | 
				
			||||||
 | 
				
			|||||||
@ -16,6 +16,7 @@
 | 
				
			|||||||
package org.thingsboard.server.common.data.cf.configuration;
 | 
					package org.thingsboard.server.common.data.cf.configuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
 | 
					import com.fasterxml.jackson.annotation.JsonIgnore;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 | 
				
			||||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
 | 
					import com.fasterxml.jackson.annotation.JsonSubTypes;
 | 
				
			||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
 | 
					import com.fasterxml.jackson.annotation.JsonTypeInfo;
 | 
				
			||||||
import org.thingsboard.server.common.data.cf.CalculatedFieldLink;
 | 
					import org.thingsboard.server.common.data.cf.CalculatedFieldLink;
 | 
				
			||||||
@ -36,6 +37,7 @@ import java.util.Map;
 | 
				
			|||||||
        @JsonSubTypes.Type(value = SimpleCalculatedFieldConfiguration.class, name = "SIMPLE"),
 | 
					        @JsonSubTypes.Type(value = SimpleCalculatedFieldConfiguration.class, name = "SIMPLE"),
 | 
				
			||||||
        @JsonSubTypes.Type(value = ScriptCalculatedFieldConfiguration.class, name = "SCRIPT")
 | 
					        @JsonSubTypes.Type(value = ScriptCalculatedFieldConfiguration.class, name = "SCRIPT")
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					@JsonIgnoreProperties(ignoreUnknown = true)
 | 
				
			||||||
public interface CalculatedFieldConfiguration {
 | 
					public interface CalculatedFieldConfiguration {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @JsonIgnore
 | 
					    @JsonIgnore
 | 
				
			||||||
 | 
				
			|||||||
@ -38,6 +38,7 @@ import org.thingsboard.server.common.data.page.PageData;
 | 
				
			|||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.Objects;
 | 
				
			||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -79,7 +80,6 @@ public class DefaultNativeCalculatedFieldRepository implements NativeCalculatedF
 | 
				
			|||||||
                JsonNode configuration = JacksonUtil.toJsonNode((String) row.get("configuration"));
 | 
					                JsonNode configuration = JacksonUtil.toJsonNode((String) row.get("configuration"));
 | 
				
			||||||
                long version = row.get("version") != null ? (long) row.get("version") : 0;
 | 
					                long version = row.get("version") != null ? (long) row.get("version") : 0;
 | 
				
			||||||
                String debugSettings = (String) row.get("debug_settings");
 | 
					                String debugSettings = (String) row.get("debug_settings");
 | 
				
			||||||
                Object externalIdObj = row.get("external_id");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                CalculatedField calculatedField = new CalculatedField();
 | 
					                CalculatedField calculatedField = new CalculatedField();
 | 
				
			||||||
                calculatedField.setId(new CalculatedFieldId(id));
 | 
					                calculatedField.setId(new CalculatedFieldId(id));
 | 
				
			||||||
@ -89,12 +89,17 @@ public class DefaultNativeCalculatedFieldRepository implements NativeCalculatedF
 | 
				
			|||||||
                calculatedField.setType(type);
 | 
					                calculatedField.setType(type);
 | 
				
			||||||
                calculatedField.setName(name);
 | 
					                calculatedField.setName(name);
 | 
				
			||||||
                calculatedField.setConfigurationVersion(configurationVersion);
 | 
					                calculatedField.setConfigurationVersion(configurationVersion);
 | 
				
			||||||
                calculatedField.setConfiguration(JacksonUtil.treeToValue(configuration, CalculatedFieldConfiguration.class));
 | 
					                try {
 | 
				
			||||||
 | 
					                    calculatedField.setConfiguration(JacksonUtil.treeToValue(configuration, CalculatedFieldConfiguration.class));
 | 
				
			||||||
 | 
					                } catch (Exception e) {
 | 
				
			||||||
 | 
					                    log.error("Invalid configuration for CalculatedField [{}]. Skipping.", id, e);
 | 
				
			||||||
 | 
					                    return null;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                calculatedField.setVersion(version);
 | 
					                calculatedField.setVersion(version);
 | 
				
			||||||
                calculatedField.setDebugSettings(JacksonUtil.fromString(debugSettings, DebugSettings.class));
 | 
					                calculatedField.setDebugSettings(JacksonUtil.fromString(debugSettings, DebugSettings.class));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                return calculatedField;
 | 
					                return calculatedField;
 | 
				
			||||||
            }).collect(Collectors.toList());
 | 
					            }).filter(Objects::nonNull).collect(Collectors.toList());
 | 
				
			||||||
            return new PageData<>(data, totalPages, totalElements, hasNext);
 | 
					            return new PageData<>(data, totalPages, totalElements, hasNext);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -118,7 +123,6 @@ public class DefaultNativeCalculatedFieldRepository implements NativeCalculatedF
 | 
				
			|||||||
                EntityType entityType = EntityType.valueOf((String) row.get("entity_type"));
 | 
					                EntityType entityType = EntityType.valueOf((String) row.get("entity_type"));
 | 
				
			||||||
                UUID entityId = (UUID) row.get("entity_id");
 | 
					                UUID entityId = (UUID) row.get("entity_id");
 | 
				
			||||||
                UUID calculatedFieldId = (UUID) row.get("calculated_field_id");
 | 
					                UUID calculatedFieldId = (UUID) row.get("calculated_field_id");
 | 
				
			||||||
                JsonNode configuration = JacksonUtil.toJsonNode((String) row.get("configuration"));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                CalculatedFieldLink calculatedFieldLink = new CalculatedFieldLink();
 | 
					                CalculatedFieldLink calculatedFieldLink = new CalculatedFieldLink();
 | 
				
			||||||
                calculatedFieldLink.setId(new CalculatedFieldLinkId(id));
 | 
					                calculatedFieldLink.setId(new CalculatedFieldLinkId(id));
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user