content: package com.github.aesteve.vertx.nubes.reflections.injectors.annot.impl;
  
  import com.github.aesteve.vertx.nubes.annotations.params.RequestBody;
  import com.github.aesteve.vertx.nubes.handlers.impl.ContentTypeProcessor;
  import com.github.aesteve.vertx.nubes.marshallers.PayloadMarshaller;
  import com.github.aesteve.vertx.nubes.reflections.injectors.annot.AnnotatedParamInjector;
  import io.vertx.core.logging.Logger;
  import io.vertx.core.logging.LoggerFactory;
  import io.vertx.ext.web.RoutingContext;
  
  import java.util.Map;
  
  public class RequestBodyParamInjector implements AnnotatedParamInjector<RequestBody> {
  
    private static final Logger LOG = LoggerFactory.getLogger(RequestBodyParamInjector.class);
  
    private final Map<String, PayloadMarshaller> marshallers;
  
    public RequestBodyParamInjector(Map<String, PayloadMarshaller> marshallers) {
      this.marshallers = marshallers;
    }
  
    @Override
    public Object resolve(RoutingContext context, RequestBody annotation, String paramName, Class<?> resultClass) {
      String body = context.getBodyAsString();
      if (resultClass.equals(String.class)) {
        return body;
      }
      String contentType = ContentTypeProcessor.getContentType(context);
      if (contentType == null) {
        LOG.error("No suitable Content-Type found, request body can't be read");
        return null;
      }
      PayloadMarshaller marshaller = marshallers.get(contentType);
      if (marshaller == null) {
        LOG.error("No marshaller found for Content-Type : " + contentType + ", request body can't be read");
        return null;
      }
      try {
        return marshaller.unmarshallPayload(body, resultClass);
      } catch (Exception e) { //NOSONAR
        // not logged, since it could lead to vulnerabilities (generating huge logs + overhead simply by sending bad payloads)
        context.fail(400);
        return null;
      }
    }
  
  }
  