2017-09-01 79 views
0

我的简化模型类门票的样子:弹簧安置实体提交的类型转换

private String ticketNumber; 
private String description; 
private String detailedDescription; 
private Integer status; 

我的目的是要返回给客户端的状态值的字符串表示。因此,响应看起来像这样:

{ 
    ticketNumber : "T00001", 
    description : "description of a ticket", 
    detailedDescription : "description of a ticket", 
    status : "Active" 
} 

的istead:

{ 
    ticketNumber : "T00001", 
    description : "description of a ticket", 
    detailedDescription : "description of a ticket", 
    status : 2 
} 

整数和字符串之间的映射可以表示为一个枚举。 但问题是我不知道如何进行转换。 的解决方案之一,可以作为描述:http://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application

我只需要一个字段(和公正的GET方法),不知道转换是否有任何不是创建一个新的DTO类简单的解决方案。

+0

您将使用TicketDto转换器的票据。 Ticket对象表示对象,因为它在数据库中。 TicketDto表示客户应该查看它的对象。您的服务将返回一张票,然后您的网络控制器或任何端点返回该票证转换为TicketDto。 – Compass

+0

您可以在对象类中使用静态地图来存储所有映射。然后创建一个函数,使用该映射从整数中返回字符串值。 – gonzo

回答

0

您应该使用JSON消息转换器。 JacksonMapperGson我的偏好是GSON。如果将库包含在类路径中,Spring应自动添加消息转换器。

要使用GSON,您需要注册一个GSON bean。 创建返回它的配置类:

@Configuration 
class GsonConfig { 
    @Bean 
    Gson gson() { return new GsonBuilder().create(); } 
} 

现在春天应该使用你创建的对象转换为JSON的GSON对象时,在控制器的请求映射方法都被注解或@ResponseBody使用@RestController

要回答您的原始问题,您需要为gson制作一个类型适配器,以便它知道如何转换对象。 您将需要改变GSON方法是这样的:

@Bean 
Gson gson() { 
    new GsonBuilder() 
     .registerTypeAdapter(Ticket.class, new JsonSerializer() { 
      public JsonElement serialize(Ticket ticket, Type type, JsonSerializationContext context) { 
       JsonObject o = new JsonObject(); 
       o.addProperty("ticketNumber", ticket.getTicketNumber()); 
       o.addProperty("description", ticket.getDescription()); 
       o.addProperty("detailedDescritpion", ticket.getDetailedDescription()); 
       String statusAsString; 
        //Covert status to string 
       o.addProperty("status", statusAsString); 
       return o; 
      } 
    }).create(); 
} 

(我没编译这个......对不起,任何语法错误和错别字)

0

声明你的状态/ ID为枚举。

@JsonValue指示应该用于序列化整个实例的单个方法。

例如,在一个枚举 - 我们用注释的@JsonValue这样的getName任何这样的实体是通过它的名字连载:

public enum TypeEnumWithValue { 
    2("Active"), 1("Closed"); 

    private String name; 

    TypeEnumWithValue(String name) { // Constructor 
     this.name= name; 
    } 

    @JsonValue 
    public String getName() { 
     return name; 
    } 
} 

而且你的票类应该有制定者/吸气的TypeEnumWithValue。当返回TypeEnumWithValue时,它将在响应中返回Name,而不是1,2.我没有编译这段代码,但它实际上可以工作。