2016-05-24 6 views
2

Ich schrieb eine Update-Methode, die Felder akzeptiert, die geändert werden.Java: Wie Felder ignoriert werden, die Null und nur mit der geänderten Eigenschaft übergeben

public ResponseEntity<String> updateProduct(@RequestBody final Product product) 
{ 
    returnValue = productService.updateProduct(product); 
} 

Produkt ist eine Bean-Klasse enthält 50 Eigenschaftsliste. Von der Benutzeroberfläche aus, wenn ich 5 Felder modifiziere, behält sie diese modifizierten Felder und andere Eigenschaften als null. Wie filtere ich hier? Ich mag

nur aktualisierte Wert
returnValue = productService.updateProduct(product); 

Antwort

4

Es ist ziemlich schwer zu sagen, passieren, ohne Code aus der Product Klasse zu sehen, noch die ProductService.updateProduct Methode. Sie können jedoch möglicherweise die Klasse BeanUtilsBean in der Apache Commons-Bibliothek verwenden.

public static void nullAwareBeanCopy(Object dest, Object source) throws IllegalAccessException, InvocationTargetException { 
    new BeanUtilsBean() { 
     @Override 
     public void copyProperty(Object dest, String name, Object value) 
       throws IllegalAccessException, InvocationTargetException { 
      if(value != null) { 
       super.copyProperty(dest, name, value); 
      } 
     } 
    }.copyProperties(dest, source); 
} 

Dies ist ein Ich schrieb aber da Ihr mit Feder möchten Sie können die Feder Bohne utils Klasse bei org.springframework.beans.BeanUtils gelegen verwenden.

public void updateProduct(Product updatedProduct) { 
    Product existingProduct = /*find existing product*/; 
    nullAwareBeanCopy(existingProduct, updatedProduct); 
    // or 
    myCopyProperties(updatedProduct, existingProduct); 
} 

Watchout dieser 2 verschiedenen Methoden Quell-/Zielparameter entgegengesetzt sind von einander: eine schnelle Suche zu tun für den Code, den ich über this answer from alfredx kam, die diesen Code

public static String[] getNullPropertyNames (Object source) { 
    final BeanWrapper src = new BeanWrapperImpl(source); 
    java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors(); 

    Set<String> emptyNames = new HashSet<String>(); 
    for(java.beans.PropertyDescriptor pd : pds) { 
     Object srcValue = src.getPropertyValue(pd.getName()); 
     if (srcValue == null) emptyNames.add(pd.getName()); 
    } 
    String[] result = new String[emptyNames.size()]; 
    return emptyNames.toArray(result); 
} 

// then use Spring BeanUtils to copy and ignore null 
public static void myCopyProperties(Object, src, Object target) { 
    BeanUtils.copyProperties(src, target, getNullPropertyNames(src)) 
} 

Sie dann verwenden Sie es mögen kann, hat .

+0

Achten Sie auf Updates, bei denen der tatsächliche neue Wert Null sein muss;) Wenn Sie nie "clear" -Werte senden, können Sie Ihren Ansatz verwenden, andernfalls müssen Sie nachverfolgen, welche Felder durch die Anfrage festgelegt wurden. –

Verwandte Themen