Wie man mit der @RequestParam(required=true) besser

Wenn in der Steuerung der springmvc Projekt, der code ist:

@Controller
@RequestMapping("/detail")
public class FileDetailController {
    @RequestMapping("/add_detail")
    @ResponseBody
    public Object addDetailWithVersionId(@RequestParam(required=true)String versionId, 
        String description) {

        if(hasVersion(versionId)) {
            FileDetail fileDetail = new FileDetail();
            fileDetail.setId(UUIDUtil.getUUID());
            fileDetail.setDescription(description);
            fileDetail.setVersionId(versionId);
           //detailService.insert(fileDetail);
            return JsonUtil.SUCCESS;
        }
        return JsonUtil.ERROR;
    }

In meinem browser, die ich Eingangs http://localhost:8080/file_server/detail/add_detail und dann die Meldung bekommen: HTTP Status 400 - Required String parameter 'versionId' is not present. Oh, der code @RequestParam(required=true)String versionId eine Rolle gespielt. Aber Ist es eine geeignete Methode, json zurückgeben zu front-end in diesem Fall?

  • Sollten Sie veröffentlichen Sie Ihre frontend-code.
InformationsquelleAutor Acceptedboy | 2016-05-07



One Reply
  1. 1

    (OPTION 1) Wenn Sie möchten, zu ändern, zurück auf das frontend, die Sie umsetzen können benutzerdefinierte org.springframework.boot.autoconfigure.web.ErrorController

    Beispielsweise mit:

    @RestController
    public class MyErrorController extends AbstractErrorController {
    
        private static final String PATH = "/error";
    
        @Autowired
        public MyErrorController(ErrorAttributes errorAttributes) {
            super(errorAttributes);
        }
    
        @RequestMapping(value = PATH)
        public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
            Map<String, Object> body = getErrorAttributes(request, false);
            HttpStatus status = getStatus(request);
            return new ResponseEntity<Map<String, Object>>(body, status);
        }
    
        @Override
        public String getErrorPath() {
            return PATH;
        }
    
    }

    werden Sie jetzt immer bekommen, so etwas wie dieses json:

    {
      "timestamp": 1462600073772,
      "status": 400,
      "error": "Bad Request",
      "exception": "org.springframework.web.bind.MissingServletRequestParameterException",
      "message": "Required String parameter 'versionId' is not present",
      "path": "/add_detail"
    }

    können anpassen, was Sie wollen, wenn Sie wollen. Ändern Sie einfach Fehler-Methode im controller.


    (OPTION 2) Verwenden Sie benutzerdefinierte @ExceptionHandler im controller. Können Lesen Sie diese für mehr info https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

    Nur etwas hinzufügen, wie Sie dies in Ihrem FileDetailController

    @Autowired
    private ErrorAttributes errorAttributes;
    
    @ExceptionHandler(MissingServletRequestParameterException.class)
    public ResponseEntity<Map<String, Object>> handle(HttpServletRequest request, Exception exception) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        Map body = this.errorAttributes.getErrorAttributes(requestAttributes,false);
    
        return new ResponseEntity<Map<String, Object>>(body, HttpStatus.BAD_REQUEST);
    }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.