2016-04-08 1 views
1

Je voudrais configurer deux HttpMessageConverters différents ayant le même MediaType pour deux contrôleurs séparés. La raison en est qu'il existe des services externes qui utilisent différents formats JSON. Nous ne sommes pas en mesure de les changer.Configurer 2 différents MessageConverters pour 2 contrôleurs

Est-ce possible? Puis-je créer deux WebMvcConfigurerAdapters et diviser le trafic en quelque sorte? Si possible, est-ce une bonne pratique?

+0

Est-ce pour un '' request' ou un response'? –

+0

Le même MC pour chaque requête et sa réponse. Mais pour différents MC en fonction du contrôleur/chemin. –

+0

J'allais suggérer d'utiliser quelque chose avec '@ ControllerAdvice' mais cela ne traiterait que le' response' ... :( –

Répondre

0

Enfin, j'ai résolu le problème en remplaçant MessageConverter ajoutant la possibilité de configurer son jaxbcontext et assigner des paquets pris en charge. Donc, je peux créer 2 MesssageConverters différents pour le même contrôleur et en fonction d'une classe de retour, utiliser l'un ou l'autre.

public class MoxyMessageConverter extends AbstractHttpMessageConverter<Object> { 

    private final JAXBContext jAXBContext; 

    private String[] supportedPackages = { ... }; // some defaults 

    public MoxyMessageConverter(JAXBContext jAXBContext) { 
    this.jAXBContext = jAXBContext; 
    } 

    public String[] getSupportedPackages() { 
    return supportedPackages; 
    } 

    public void setSupportedPackages(String[] supportedPackages) { 
    this.supportedPackages = supportedPackages; 
    } 

    @Override 
    protected boolean supports(Class<?> clazz) { 
    String packageName = clazz.getPackage().getName(); 
    for (String supportedPackage : supportedPackages) { 
     if (packageName.startsWith(supportedPackage)) 
     return true; 
    } 
    return false; 
    } 

@Override 
    protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 
.. 
} 

@Override 
    protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { 
.. 
} 
} 

et dans la classe @Configuration:

@Configuration 
@EnableWebMvc 
@EnableTransactionManagement 
public class WebMvcConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { 
    super.extendMessageConverters(converters); 
    MoxyMessageConverter defaultMessageConverter = new MoxyMessageConverter(defaultJAXBContext); 
    defaultMessageConverter.setSupportedPackages(new String[] { "xxx.xxx.xxx.webservices" }); 
    converters.add(0, defaultMessageConverter); 

    MoxyMessageConverter payUMessageConverter = new MoxyMessageConverter(payUJAXBContext); 
    payUMessageConverter.setSupportedPackages(new String[] { "xxx.xxx.xxx.webservices.payu" }); 
    converters.add(0, payUMessageConverter); 
    } 
}