为 2 个控制器配置 2 个不同的 MessageConverter
Configure 2 different MessageConverters for 2 Controllers
我想为两个单独的控制器配置两个具有相同 MediaType
的不同 HttpMessageConverters
。原因是有一些外部服务使用不同的 JSON 格式。我们无法更改它们。
可能吗?我可以创建两个 WebMvcConfigurerAdapters
并以某种方式拆分流量吗?如果可能的话,这是一个好习惯吗?
最后,我通过覆盖 MessageConverter 添加配置其 jaxbcontext 和分配支持的包的可能性解决了这个问题。因此,然后我可以为同一个控制器创建 2 个不同的 MesssageConverter,并根据 return class 使用一个或另一个。
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 {
..
}
}
并在@Configuration class:
@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);
}
}
我想为两个单独的控制器配置两个具有相同 MediaType
的不同 HttpMessageConverters
。原因是有一些外部服务使用不同的 JSON 格式。我们无法更改它们。
可能吗?我可以创建两个 WebMvcConfigurerAdapters
并以某种方式拆分流量吗?如果可能的话,这是一个好习惯吗?
最后,我通过覆盖 MessageConverter 添加配置其 jaxbcontext 和分配支持的包的可能性解决了这个问题。因此,然后我可以为同一个控制器创建 2 个不同的 MesssageConverter,并根据 return class 使用一个或另一个。
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 {
..
}
}
并在@Configuration class:
@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);
}
}