2017-07-17 3 views
1

Ich habe eine einzige @RequestMapping, die einen benutzerdefinierten MIME-Typ verbraucht. Die Anforderung verwendet eine ObjectMapper Bean, die in definiert ist, um die JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER zu aktivieren.Verschiedene jackson ObjectMapper für separate RequestMapping verwenden

Diese Funktion ermöglicht es typischerweise ungültig json (Schrägstriche als Nicht-Sonderzeichen Behandlung) verbraucht werden, was eine Voraussetzung dieser besonderen @RequestMapping ist, damit Polylinien Google verschlüsselt direkt analysiert werden. Dies bedeutet jedoch, dass dieser ObjectMapper jetzt für ALL meiner @RequestMapping verwendet wird, wenn es wirklich nur eine Voraussetzung ist.

Gibt es eine Möglichkeit, den ObjectMapper, der für jede @Controller oder @RequestMapping verwendet wird, zu unterscheiden?

Object Mapper Bean

@Bean 
public ObjectMapper objectMapper() { 
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
    builder.featuresToEnable(
     JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER); 

    return builder.build(); 
} 

Anfrage Mapping Interface-Methode

@ApiOperation(value = "Returns the toll cost breakdown for a journey", notes = "", response = TotalCost.class, tags={ "pricing", }) 
@ApiResponses(value = { 
    @ApiResponse(code = 200, message = "successful operation", response = TotalCost.class) }) 
@RequestMapping(value = "/pricing/journeyCost", 
    produces = { "application/json" }, 
    consumes = { "application/vnd.toll-pricing+json" }, 
    method = RequestMethod.POST) 
ResponseEntity<TotalCost> getTollBreakdownFromEncodedPoly(@ApiParam(value = "Request object representing the journey" ,required=true) @RequestBody Journey body); 
+0

Haben Sie nur für die individuelle Handhabung wollen die Journey-Schnittstelle? –

+0

@lexknuther im Wesentlichen ja. – Jags

+0

Und welche Version von Jackson benutzt du? –

Antwort

0

fand ich die Antwort in einer anderen Stackoverflow von einem anderen Benutzer mir verknüpft Frage - https://stackoverflow.com/a/45157169/2073800

musste ich einfach meinen folgenden @Bean hinzufügen @Configuration

@Bean 
public HttpMessageConverters customConverters() { 
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
    builder.featuresToEnable(
     JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER); 

    final AbstractJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build()); 
    converter.setSupportedMediaTypes(Collections.singletonList(MediaType.valueOf("application/vnd.toll-pricing+json"))); 

    return new HttpMessageConverters(converter); 
} 
1

Wenn Sie einen benutzerdefinierten MIME-Typ haben, dann können Sie eine benutzerdefinierte registrieren HttpMessageConverter, die eine spezielle ObjectMapper verwendet für Ihren MIME-Typ und gibt false von canRead/canWrite für normale MIME-Typen zurück. Sie registrieren Ihre benutzerdefinierten HttpMessageConverter wie so:

@EnableWebMvc 
@Configuration 
@ComponentScan 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureMessageConverters(
     List<HttpMessageConverter<?>> converters) { 

     messageConverters.add(myCustomMessageConverter()); 

     super.configureMessageConverters(converters); 
    } 
} 

Betrachten Sie es als zu Content Negotiation verwandt und nicht auf URL-Zuordnung bezieht; URL-Mapping (@RequestMapping) ist für die Suche nach einem Handler gedacht, nicht für die Auswahl, welcher Marshaller/Unmarshaller verwendet werden soll.

+0

Understanding Content Verhandlung und ein Kommentar zu meiner Frage wies mich in die richtige Richtung. Ich bezweifle nicht, dass die obige Lösung funktioniert hätte, aber ich fand etwas leichter. – Jags

+0

@Jags Ich sah, was Szymon Stepniak in dem anderen Thread hatte, und es ist genau das, was ich sagte, außer für den Teil, wie Sie den Konverter registrieren. Wenn du sagst, dass du nicht zweifelst, dass das obige funktioniert hat, bezweifle ich, dass du nicht wirklich verstehst, was vor sich geht. –

+0

Ich bin nicht anderer Ansicht, dass Ihre Antworten ähnlich sind, aber seine Antwort war viel einfacher zu folgen und besser erklärt. Ich stimme auch zu, dass ich die Feinheiten wahrscheinlich nicht vollständig verstehe, aber vielleicht spiegelt das auch die Qualität Ihrer Antwort wider. Ich habe deine Antwort angewendet und aus meinem Verständnis heraus habe ich ein benutzerdefiniertes Werkzeug eines 'HttpMessageConverter' erstellt und die Methoden überschrieben, um nur einen' MediaType' zu ​​akzeptieren. Szymons Antwort war viel prägnanter und direkter. – Jags

Verwandte Themen