package org.springframework.issues.config; import com.google.protobuf.ExtensionRegistry; import com.google.protobuf.Message; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpOutputMessage; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.http.converter.protobuf.ExtensionRegistryInitializer; import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; import org.springframework.util.FileCopyUtils; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; import java.io.IOException; import java.util.List; @EnableWebMvc @ComponentScan(basePackages = "org.springframework.issues") @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".jsp"); return viewResolver; } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { if (System.getProperty("fixed") == null) { System.err.println("==== Problem sample! ===="); converters.add(new ProtobufHttpMessageConverter(new ExtensionRegistryInitializer() { @Override public void initializeExtensionRegistry(ExtensionRegistry registry) { } })); } else { System.err.println("==== Fixed sample! ===="); converters.add(new ProtobufHttpMessageConverter(new ExtensionRegistryInitializer() { @Override public void initializeExtensionRegistry(ExtensionRegistry registry) { } }) { @Override protected void writeInternal(Message message, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { outputMessage.getHeaders().set(X_PROTOBUF_SCHEMA_HEADER, message.getDescriptorForType().getFile().getName()); outputMessage.getHeaders().set(X_PROTOBUF_MESSAGE_HEADER, message.getDescriptorForType().getFullName()); FileCopyUtils.copy(message.toByteArray(), outputMessage.getBody()); } }); } } }