我有一個物件(此處:屬性),我想為我的 Spring 后端添加 csv 匯出功能,用于單個物件和物件串列。
我將此添加到我的配置中:
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.(more config).mediaType("csv", new MediaType("text", "csv"));
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new PropertyConverter());
converters.add(new StatsConverter());
}
屬性轉換器如下所示:
public class PropertyConverter extends AbstractGenericHttpMessageConverter<Property> {
private static final Logger LOGGER = LoggerFactory.getLogger(PropertyConverter.class);
public PropertyConverter() {
super(new MediaType("text", "csv"));
}
@Override
protected void writeInternal(Property property, Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
try (var writer = new OutputStreamWriter(outputMessage.getBody())) {
new StatefulBeanToCsvBuilder<>(writer).withSeparator(',').build().write(property);
} catch (CsvDataTypeMismatchException | CsvRequiredFieldEmptyException ex) {
LOGGER.error("CSV failed to convert property: ".concat(property.getExternalId()).concat(", exception: ".concat(ex.toString())));
}
}
@Override
protected Property readInternal(Class<? extends Property> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
return null;
}
@Override
public Property read(Type type, Class<?> contextClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
return null;
}
}
此代碼適用于單個屬性。當我嘗試回傳屬性串列時:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class eu.webeng.model.Property (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; eu.webeng.model.Property is in unnamed module of loader 'app')
...
Caused by: java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class eu.webeng.model.Property (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; eu.webeng.model.Property is in unnamed module of loader 'app')
at eu.webeng.converter.PropertyConverter.writeInternal(PropertyConverter.java:20) ~[classes/:na]
at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) ~[spring-web-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:287) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:219) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) ~[spring-web-5.2.8.RELEASE.jar:5.2.8.RELEASE]
....
我試圖添加一個 PropertyListConverter,但它不適用于 Single Property。當我嘗試添加兩者時,正在使用添加的第一個轉換器。
如何使轉換器適用于單個和屬性串列(或任何物件)
uj5u.com熱心網友回復:
如果您嘗試將以下方法添加到您的(單一屬性)轉換器中,它是否有效?
@Override
public boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {
return super.canWrite(clazz, mediaType) && clazz == Property.class;
}
該類AbstractMessageConverterMethodProcessor遍歷所有已注冊的轉換器并跳過該canWrite方法回傳的任何轉換器false。我已經從類中改編了上面的方法,AbstractGenericHttpMessageConverter對要寫入的值的類添加了額外的檢查,因此它應該只用于寫出Property值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/418856.html
標籤:
