Close

Spring MVC - HttpMessageConverter Examples

Spring MVC 

A converter for CSV content

import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import com.opencsv.bean.CsvToBean;
import com.opencsv.bean.HeaderColumnNameMappingStrategy;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

public class CsvHttpMessageConverter<T, L extends ListParam<T>>
extends AbstractHttpMessageConverter<L> {

public CsvHttpMessageConverter () {
super(new MediaType("text", "csv"));
}

@Override
protected boolean supports (Class<?> clazz) {
return ListParam.class.isAssignableFrom(clazz);
}

@Override
protected L readInternal (Class<? extends L> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
HeaderColumnNameMappingStrategy<T> strategy = new HeaderColumnNameMappingStrategy<>();
Class<T> t = toBeanType(clazz.getGenericSuperclass());
strategy.setType(t);

CSVReader csv = new CSVReader(new InputStreamReader(inputMessage.getBody()));
CsvToBean<T> csvToBean = new CsvToBean<>();
List<T> beanList = csvToBean.parse(strategy, csv);
try {
L l = clazz.newInstance();
l.setList(beanList);
return l;
} catch (Exception e) {
throw new RuntimeException(e);
}
}

@SuppressWarnings("unchecked")
@Override
protected void writeInternal (L l, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {

HeaderColumnNameMappingStrategy<T> strategy = new HeaderColumnNameMappingStrategy<>();
strategy.setType(toBeanType(l.getClass().getGenericSuperclass()));

OutputStreamWriter outputStream = new OutputStreamWriter(outputMessage.getBody());
StatefulBeanToCsv<T> beanToCsv =
new StatefulBeanToCsvBuilder(outputStream)
.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
.withMappingStrategy(strategy)
.build();
try {
beanToCsv.write(l.getList());
outputStream.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

@SuppressWarnings("unchecked")
private Class<T> toBeanType (Type type) {
return (Class<T>) ((ParameterizedType) type).getActualTypeArguments()[0];
}
}
Original Post




A converter for YAML content.

import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.yaml.snakeyaml.Yaml;

import java.io.IOException;
import java.io.OutputStreamWriter;

public class YamlHttpMessageConverter<T>
extends AbstractHttpMessageConverter<T> {

public YamlHttpMessageConverter () {
super(new MediaType("text", "yaml"));
}

@Override
protected boolean supports (Class<?> clazz) {
return true;
}

@Override
protected T readInternal (Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
Yaml yaml = new Yaml();
T t = yaml.loadAs(inputMessage.getBody(), clazz);
return t;
}

@Override
protected void writeInternal (T t, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
Yaml yaml = new Yaml();
OutputStreamWriter writer = new OutputStreamWriter(outputMessage.getBody());
yaml.dump(t, writer);
writer.close();
}
}
Original Post




public class ReportConverter
extends AbstractHttpMessageConverter<Report> {

public ReportConverter() {
super(new MediaType("text", "report"));
}

@Override
protected boolean supports(Class<?> clazz) {
return Report.class.isAssignableFrom(clazz);
}

@Override
protected Report readInternal(Class<? extends Report> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
String requestBody = toString(inputMessage.getBody());
int i = requestBody.indexOf("\n");
if (i == -1) {
throw new HttpMessageNotReadableException("No first line found");
}

String reportName = requestBody.substring(0, i).trim();
String content = requestBody.substring(i).trim();

Report report = new Report();
report.setReportName(reportName);
report.setContent(content);
return report;
}

@Override
protected void writeInternal(Report report, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
try {
OutputStream outputStream = outputMessage.getBody();
String body = report.getReportName() + "\n" +
report.getContent();
outputStream.write(body.getBytes());
outputStream.close();
} catch (Exception e) {
}
}

private static String toString(InputStream inputStream) {
Scanner scanner = new Scanner(inputStream, "UTF-8");
return scanner.useDelimiter("\\A").next();
}
}
Original Post




See Also