为不同端点切换 JSON 个序列化程序
Toggle JSON serializers for different endpoints
在 Jersey
的端点中,我想 return 相同 DTO
但通过使用不同的序列化程序对其进行不同的序列化:需要不同的 Date
格式。
public class Foo {
private Date foo;
public Foo() {
this.foo = new Date();
}
public Date getFoo() {
return foo;
}
public void setFoo(Date foo){
this.foo = foo;
}
}
public class MyEndpointsUnix {
@GET
@Path("/dateAsUnix")
public Foo getDateAsUnix() {
return new Foo();
}
}
public class MyEndpointsUTC {
@GET
@Path("/dateAsUTC")
public Foo getdateAsUTC() {
return new Foo();
}
}
我想应该可以手动更改响应的序列化程序。
从OOP
的角度我们可以为每一种view
创建新的class:
class UnixFoo extends Foo {
private Foo foo;
public UnixFoo(Foo foo) {
this.foo = foo;
}
@JsonFormat(pattern = "yyyy-MM-dd")
@Override
public Date getFoo() {
return foo.getFoo();
}
// other getters
}
在我们的控制器中我们可以:
public class MyEndpointsUnix {
@GET
@Path("/dateAsUnix")
public Foo getDateAsUnix() {
return new UnixFoo(new Foo());
}
}
当然这个解决方案有一个缺点,我们需要复制我们的 DTO
classes。为避免这种情况,我们可以使用 Jackson MixIn Annotation。为此,我们应该创建新界面:
interface UnixFooMixIn {
@JsonFormat(pattern = "yyyy-MM-dd")
Date getFoo();
}
并用它丰富 ObjectMapper
:
public class MyEndpointsUnix {
@GET
@Path("/dateAsUnix")
public String getDateAsUnix() {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.addMixIn(Foo.class, UtcFooMixIn.class);
return mapper.writeValueAsString(new Foo());
}
}
在这种情况下,我们需要更改我们的方法签名和 return String
。我们也可以创建这个 ObjectMapper
一次并将其用作单例。对于每一种 view
我们需要定义新的 interface
和新的 ObjectMapper
实例。
在 Jersey
的端点中,我想 return 相同 DTO
但通过使用不同的序列化程序对其进行不同的序列化:需要不同的 Date
格式。
public class Foo {
private Date foo;
public Foo() {
this.foo = new Date();
}
public Date getFoo() {
return foo;
}
public void setFoo(Date foo){
this.foo = foo;
}
}
public class MyEndpointsUnix {
@GET
@Path("/dateAsUnix")
public Foo getDateAsUnix() {
return new Foo();
}
}
public class MyEndpointsUTC {
@GET
@Path("/dateAsUTC")
public Foo getdateAsUTC() {
return new Foo();
}
}
我想应该可以手动更改响应的序列化程序。
从OOP
的角度我们可以为每一种view
创建新的class:
class UnixFoo extends Foo {
private Foo foo;
public UnixFoo(Foo foo) {
this.foo = foo;
}
@JsonFormat(pattern = "yyyy-MM-dd")
@Override
public Date getFoo() {
return foo.getFoo();
}
// other getters
}
在我们的控制器中我们可以:
public class MyEndpointsUnix {
@GET
@Path("/dateAsUnix")
public Foo getDateAsUnix() {
return new UnixFoo(new Foo());
}
}
当然这个解决方案有一个缺点,我们需要复制我们的 DTO
classes。为避免这种情况,我们可以使用 Jackson MixIn Annotation。为此,我们应该创建新界面:
interface UnixFooMixIn {
@JsonFormat(pattern = "yyyy-MM-dd")
Date getFoo();
}
并用它丰富 ObjectMapper
:
public class MyEndpointsUnix {
@GET
@Path("/dateAsUnix")
public String getDateAsUnix() {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.addMixIn(Foo.class, UtcFooMixIn.class);
return mapper.writeValueAsString(new Foo());
}
}
在这种情况下,我们需要更改我们的方法签名和 return String
。我们也可以创建这个 ObjectMapper
一次并将其用作单例。对于每一种 view
我们需要定义新的 interface
和新的 ObjectMapper
实例。