wie, um wieder eine custom Feder Fehler-Antwort mit benutzerdefinierten parameter Anmerkungen?

Ich bin neue auf den Frühling, also bitte entschuldigt meine Unwissenheit.
Ich bin versucht, "zurück" eine eigene Antwort, wenn eine gegebene Methode parameter, die "erforderlich", ist null.
die aktuelle Antwort von Frühling, ist:

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

Ich versuche zu einem Punkt, wo es "gibt":

{
  "status": 400,
  "error": {
    //custom error body
  }
}

Dachte ich, ein schöner Weg, dies zu tun wäre, um eine benutzerdefinierte "- parameter der annotation". Dies würde auch den code sehr viel besser lesbar und speichern nützliche Informationen über das endpoint-parameter.

Folgte ich dem Beispiel hier, aber ich bin nicht sicher, wo oder wie die Rückkehr der benutzerdefinierten Antwort?

Bisher habe ich die Anmerkung:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface customParameter {

String value() default "";
boolean required() default false;
String defaultValue() default ValueConstants.DEFAULT_NONE;
String customInfo() default  "blar blar";
}

den "Endpunkt" :

  @RequestMapping(value = "/getbook", method = {RequestMethod.POST})
  public ResponseEntity<BookResponse> getBookInfo(
      @customParameter(value = "bookname", required = true, customInfo = "extremely valuable book")
      final String bookname
   ) {
    return new bookRequest(bookname).getResponse;
}

haben und ein benutzerdefinierter Konfliktlöser :

public class CustomAnnotationResolver implements HandlerMethodArgumentResolver {


  @Override
  public boolean supportsParameter(MethodParameter parameter) {
    return parameter.getParameterAnnotation(customParameter.class) != null;
  }


  @Override
  public Object resolveArgument(MethodParameter methodparameter, ModelAndViewContainer mavContainer,
      NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

    CustomParameter customParameter = methodparameter.getParameterAnnotation(CustomParameter.class);

    String parameter = webRequest.getParameter(CustomParameter.value());

    //todo: do Validation here
    if (customParameter == null) {
      if (Parameter.required()) {
        String customInfo = customParameter.customInfo();
        String body getBody(customInfo);
        new ResponseEntity(body, 400); //so the problem is here!! how do I return this response??  
      }
    }

    return webRequest.getParameter(customParameter.value());

  }
}

Habe ich auch "registriert" diese resolver mit dem webConfig :

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(new CustomAnnotationResolver());
  }
}

Hilfe mit dieser Umsetzung oder irgendwelche anderen Vorschläge, wie dies zu tun wäre fantastisch. Vielen Dank an alle 🙂

  • wenn Sie möchten, Griff de Antwort leicht können Sie ein trasnlation controller mit @ControllerAdvice; diese Vorgehensweise catchs die rumtime Ausnahmen, was Sie wollen, handhaben und erstellen Sie eine benutzerdefinierte Fehlerantwort wie Sie wollen, in einem errorDTO objet, die mit den Attributen, die Sie benötigen zu zeigen.
  • also sollte ich Fehler in resolveArgument(){} und fangen es, wie Sie vorgeschlagen.? Könnten Sie ein Beispiel bitte, ich bin ein wenig verloren, ist klar ersichtlich. es sieht aus wie Frühling, raps, was auch immer werfe ich einen 500 Fehler.
  • Zum anpassen der Körper für einen Fehler-status zurück können Sie eine benutzerdefinierte java-bean in der @ExceptionHandler des @ControllerAdvice. Sie können sich dieses kleine Beispiel ich schrieb.
InformationsquelleAutor Luke_P | 2016-11-17
Schreibe einen Kommentar