Java 从不同的请求返回不同的JSON对象

Java 从不同的请求返回不同的JSON对象,java,json,spring,rest,design-patterns,Java,Json,Spring,Rest,Design Patterns,我在Spring控制器中有一个writeResponse方法,它将DTO写入Json: private void writeResponse(String type , Object objectToWrite , ResourceResponse response){ try { MyDTO myDto= new MyDTO (); ObjectMapper mapper = new ObjectMapper(); response.

我在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的混合

因为您有单独的URL,每个URL都呈现不同的JSON内容,所以听起来这里唯一的共同代码是

ObjectMapper mapper = new ObjectMapper();
response.getWriter().write(mapper.writeValueAsString(myDto));
也许这就是你的书面回复应该做的。把它改成

  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());
        }
    }

并让调用方决定要创建哪个数据。如果您想抽象掉选择要创建哪个数据的逻辑,那么您可以在一个单独的方法中完成。此时,您的控制器只是授权给这两种方法。

您可以创建一个接口:

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());
    }
}

什么是
ResourceResponse
?这种方法在哪里存在?在服务中,控制器,其他?看看。特别是@RequestMapping注释。