我在Spring控制器中有一个writeResponse方法,它将DTO写为Json:
private void writeResponse(String type , Object objectToWrite , ResourceResponse response){
try {
MyDTO myDto= new MyDTO ();
ObjectMapper mapper = new ObjectMapper();
response.getWriter().write(mapper.writeValueAsString(myDto));
}
catch (final JsonGenerationException e) {
log.error(e.getMessage());
} catch (final JsonMappingException e) {
log.error(e.getMessage());
} catch (final IOException e) {
log.error(e.getMessage());
}
}
方法writeResponse由多个方法调用,每个调用方法都是不同的REST端点。 目前只有一种DTO类型:MyDTO。但是会添加更多DTO类型。要确定应该写入哪个DTO,有一个'type'方法参数。所以上面的方法可能变成:
private void writeResponse(String type , Object objectToWrite , ResourceResponse response){
try {
if(type == "1"){
MyDTO myDto= new MyDTO ();
ObjectMapper mapper = new ObjectMapper();
response.getWriter().write(mapper.writeValueAsString(myDto));
}
else if(type == "2")
{
MyDTO2 myDto2= new MyDTO2 ();
ObjectMapper mapper = new ObjectMapper();
response.getWriter().write(mapper.writeValueAsString(myDto2));
}
}
catch (final JsonGenerationException e) {
log.error(e.getMessage());
} catch (final JsonMappingException e) {
log.error(e.getMessage());
} catch (final IOException e) {
log.error(e.getMessage());
}
}
这感觉有点笨重。我正在尝试实现一个干净的方法,根据调用的端点返回不同的JSON。有没有比我建议的更好的方式?
注意:上面的代码是伪代码和java的混合。
答案 0 :(得分:1)
由于您有单独的网址,每个网址都呈现不同的JSON内容,因此听起来像这里唯一的常见代码是
ObjectMapper mapper = new ObjectMapper();
response.getWriter().write(mapper.writeValueAsString(myDto));
也许这就是你所有的writeResponse应该做的。将其更改为
private void writeResponse(Object objectToWrite , ResourceResponse response){
try {
ObjectMapper mapper = new ObjectMapper();
response.getWriter().write(mapper.writeValueAsString(objectToWrite));
}
catch (final JsonGenerationException e) {
log.error(e.getMessage());
} catch (final JsonMappingException e) {
log.error(e.getMessage());
} catch (final IOException e) {
log.error(e.getMessage());
}
}
让调用者决定创建哪个DTO。如果您想抽象出选择要创建哪个DTO的逻辑,那么您可以在单独的方法中执行此操作。那时你的控制器就是委托给这两种方法。
答案 1 :(得分:0)
您可以创建一个界面:
public interface HasDto {
Object getDto();
}
给定的对象类将实现getDto
,如下所示:
@Override
public Object getDto() {
return new Dto1()
}
并接受HasDto
方法中的writeResponse
对象,如下所示:
private void writeResponse(HasDto hasDto , ResourceResponse response) {
try {
ObjectMapper mapper = new ObjectMapper();
response.getWriter().write(mapper.writeValueAsString(hasDto.getDto()));
}
catch (final JsonGenerationException e) {
log.error(e.getMessage());
} catch (final JsonMappingException e) {
log.error(e.getMessage());
} catch (final IOException e) {
log.error(e.getMessage());
}
}