2015-11-12 4 views
12

डीटीओ:मैं वसंत @ वैध सत्यापन से डिफ़ॉल्ट त्रुटि संदेश कैसे अनुकूलित करूं?

public class User { 

    @NotNull 
    private String name; 

    @NotNull 
    private String password; 

    //.. 
} 

नियंत्रक:

@RequestMapping(value = "/user", method = RequestMethod.POST) 
public ResponseEntity<String> saveUser(@Valid @RequestBody User user) { 
    //.. 
    return new ResponseEntity<>(HttpStatus.OK); 
} 

डिफ़ॉल्ट json त्रुटि:

{"timestamp":1417379464584,"status":400,"error":"Bad Request","exception":"org.springframework.web.bind.MethodArgumentNotValidException","message":"Validation failed for argument at index 0 in method: public org.springframework.http.ResponseEntity<demo.User> demo.UserController.saveUser(demo.User), with 2 error(s): [Field error in object 'user' on field 'name': rejected value [null]; codes [NotNull.user.name,NotNull.name,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.name,name]; arguments []; default message [name]]; default message [may not be null]],"path":"/user"} 

मैं अपने कस्टम json के लिए के लिए प्रत्येक त्रुटि हो गई चाहते हैं। मैं इसे कैसे पूरा करूं?

उत्तर

5

आप त्रुटियों/BindingResult ऑब्जेक्ट के साथ सत्यापन कर सकते हैं। त्रुटियों को आपके नियंत्रक विधि में जोड़ें और त्रुटियों के दौरान त्रुटि संदेश को कस्टमाइज़ करें।

नीचे नमूना उदाहरण है, त्रुटियाँ.hasErrors() सत्यापन विफल होने पर सत्य लौटाता है।

@RequestMapping(value = "/user", method = RequestMethod.POST) 
@ResponseBody 
public ResponseEntity<String> saveUser(@Valid @RequestBody User user, Errors errors) { 
    if (errors.hasErrors()) { 
     return new ResponseEntity(new ApiErrors(errors), HttpStatus.BAD_REQUEST); 
    } 
    return new ResponseEntity<>(HttpStatus.OK); 
} 
+0

@ksaughs क्या ApiErrors वर्ग है? – user6123723

+0

org.springframework.validation. वसंत-संदर्भ जार – kswaughs

+0

@kswaughs से त्रुटि, मैंने हर जगह ApiErrors की खोज की और इसे कहीं भी नहीं मिला। मैंने मेवेन में वसंत-संदर्भ निर्भरता भी शामिल की और कुछ भी नहीं मिला। एकमात्र वेब परिणाम इस स्टैक ओवरफ्लो पृष्ठ पर हैं जहां आप इसे अपने उत्तर में उल्लेख करते हैं। क्या आप सहायता कर सकते हैं? – user238607

14

आप हर नियंत्रक में प्रतिक्रिया संदेश पर पूरा नियंत्रण चाहते हैं एक ControllerAdvice लिखें। उदाहरण के लिए, कि उदाहरण के लिए एक कस्टम json वस्तु में बदलना MethodArgumentNotValidException:

import org.springframework.core.Ordered; 
import org.springframework.core.annotation.Order; 
import org.springframework.validation.BindingResult; 
import org.springframework.web.bind.MethodArgumentNotValidException; 
import org.springframework.web.bind.annotation.ControllerAdvice; 
import org.springframework.web.bind.annotation.ExceptionHandler; 
import org.springframework.web.bind.annotation.ResponseBody; 
import org.springframework.web.bind.annotation.ResponseStatus; 

import java.util.ArrayList; 
import java.util.List; 

import static org.springframework.http.HttpStatus.BAD_REQUEST; 

/** 
* Kudos http://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-adding-validation-to-a-rest-api/ 
* 
*/ 
@Order(Ordered.HIGHEST_PRECEDENCE) 
@ControllerAdvice 
public class MethodArgumentNotValidExceptionHandler { 

    @ResponseStatus(BAD_REQUEST) 
    @ResponseBody 
    @ExceptionHandler(MethodArgumentNotValidException.class) 
    public Error methodArgumentNotValidException(MethodArgumentNotValidException ex) { 
     BindingResult result = ex.getBindingResult(); 
     List<org.springframework.validation.FieldError> fieldErrors = result.getFieldErrors(); 
     return processFieldErrors(fieldErrors); 
    } 

    private Error processFieldErrors(List<org.springframework.validation.FieldError> fieldErrors) { 
     Error error = new Error(BAD_REQUEST.value(), "validation error"); 
     for (org.springframework.validation.FieldError fieldError: fieldErrors) { 
      error.addFieldError(fieldError.getField(), fieldError.getDefaultMessage()); 
     } 
     return error; 
    } 

    static class Error { 
     private final int status; 
     private final String message; 
     private List<FieldError> fieldErrors = new ArrayList<>(); 

     Error(int status, String message) { 
      this.status = status; 
      this.message = message; 
     } 

     public int getStatus() { 
      return status; 
     } 

     public String getMessage() { 
      return message; 
     } 

     public void addFieldError(String path, String message) { 
      FieldError error = new FieldError(path, message); 
      fieldErrors.add(error); 
     } 

     public List<FieldError> getFieldErrors() { 
      return fieldErrors; 
     } 
    } 
} 
4

मैं जानता हूँ कि इस पुराने सवाल की तरह है,

लेकिन मैं इसे में चलाने के लिए और मैं कुछ बहुत अच्छा article जो भी एक है पाया github में सही उदाहरण।

मूल रूप से यह @ControllerAdvice का उपयोग करता है के रूप में वसंत प्रलेखन पता चलता है।

@ControllerAdvice 
public class CustomRestExceptionHandler extends ResponseEntityExceptionHandler { 

    @Override 
    protected ResponseEntity<Object> handleMethodArgumentNotValid(final MethodArgumentNotValidException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request) { 
     logger.info(ex.getClass().getName()); 
     // 
     final List<String> errors = new ArrayList<String>(); 
     for (final FieldError error : ex.getBindingResult().getFieldErrors()) { 
      errors.add(error.getField() + ": " + error.getDefaultMessage()); 
     } 
     for (final ObjectError error : ex.getBindingResult().getGlobalErrors()) { 
      errors.add(error.getObjectName() + ": " + error.getDefaultMessage()); 
     } 
     final ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ex.getLocalizedMessage(), errors); 
     return handleExceptionInternal(ex, apiError, headers, apiError.getStatus(), request); 
    } 
} 

2

एक तरीका यह है क्या करने के लिए (apiError वर्ग का दर्जा, संदेश धारण करने के लिए एक सरल वस्तु, त्रुटियों है):

उदाहरण 400 त्रुटि को पकड़ने के लिए

तो एक समारोह अधिभावी द्वारा प्राप्त किया जाएगा @NotNull एनोटेशन में संदेश जोड़ना।

डीटीओ:

public class User { 

    @NotNull(message = "User name cannot be empty") 
    private String name; 

    @NotNull(message = "Password cannot be empty") 
    private String password; 

    //.. 
} 

नियंत्रक:

@RequestMapping(value = "/user", method = RequestMethod.POST) 
public ResponseEntity<String> saveUser(@Valid @RequestBody User user) { 
    //.. 
    return new ResponseEntity<>(HttpStatus.OK); 
} 
// Add one 
@ExceptionHandler(MethodArgumentNotValidException.class) 
public ResponseEntity<List<YourErrorResponse>> handleException(MethodArgumentNotValidException ex) { 
// Loop through FieldErrors in ex.getBindingResult(); 
// return *YourErrorReponse* filled using *fieldErrors* 
} 
संबंधित मुद्दे

 संबंधित मुद्दे