如何在 MicroProfile Rest Client 使用的 Json Serializer 上设置特定格式的表示?
How to set representation for specific format on Json Serializer used by MicroProfile Rest Client?
如何在 Json MicroProfile Rest Client 使用的序列化器上设置特定格式的表示?
我有一项服务需要年月输入,格式为 ISO 8601“YYYY-MM”。服务器端正常工作,响应格式正确,但实现是 Resteasy。
我正在使用 MicroProfile Rest Client,实体属性定义为 java.util.YearMonth
。
当我希望它是一个格式化的字符串时,请求是用序列化的 JSON 表示为一个对象的年月属性发送的。
已经尝试使用 JsonFormat
、JsonbDateFormat
和 @Schema
注释属性,结果相同。
还尝试添加 Jackson Provider (ContextResolver),它适用于服务器端,但在客户端没有任何变化。
睾丸注释代码片段:
import com.fasterxml.jackson.annotation.JsonFormat;
import org.eclipse.microprofile.openapi.annotations.media.Schema;
import javax.json.bind.annotation.JsonbDateFormat;
@JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM")
@JsonbDateFormat(value = "yyyy-MM")
// Next one I'm guessing. Can't find docs for this.
@Schema(type = SchemaType.STRING, implementation = YearMonth.class, pattern = "yyyy-MM")
private YearMonth referencia;
环境:
- 野蝇 21
- Java 东南 11
- microprofile-rest-client-api:2.0
- microprofile-openapi-api:2.0
1. 首先,您需要启用 Jackson,因为 RESTEasy 默认为 JSONB。为此,您需要添加此 系统 属性:
- resteasy.preferJacksonOverJsonB = 真
添加系统 属性 作为您的偏好,使用 -Dproperty=value
命令行语法或其他。在我们的例子中,我们使用 WildFly 配置(例如 standalone.xml):
<system-properties>
<property name="resteasy.preferJacksonOverJsonB" value="true"/>
</system-properties>
2. 然后您可以将 Jackson 配置提供程序 添加到您的 REST 客户端界面:
import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
@RegisterProvider(JacksonConfiguration.class)
@RegisterRestClient
public interface RestTestService {
// methods...
}
现在,Java 8 日期时间 API 将正确序列化,如果需要,您可以使用 @JsonFormat
添加自定义格式。
另外:这里有一个 Jackson 配置提供程序的示例,它也可以在客户端和服务器端使用:
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
@Provider
public class JacksonConfiguration implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public JacksonConfiguration() {
mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
如何在 Json MicroProfile Rest Client 使用的序列化器上设置特定格式的表示?
我有一项服务需要年月输入,格式为 ISO 8601“YYYY-MM”。服务器端正常工作,响应格式正确,但实现是 Resteasy。
我正在使用 MicroProfile Rest Client,实体属性定义为 java.util.YearMonth
。
当我希望它是一个格式化的字符串时,请求是用序列化的 JSON 表示为一个对象的年月属性发送的。
已经尝试使用 JsonFormat
、JsonbDateFormat
和 @Schema
注释属性,结果相同。
还尝试添加 Jackson Provider (ContextResolver),它适用于服务器端,但在客户端没有任何变化。
睾丸注释代码片段:
import com.fasterxml.jackson.annotation.JsonFormat;
import org.eclipse.microprofile.openapi.annotations.media.Schema;
import javax.json.bind.annotation.JsonbDateFormat;
@JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM")
@JsonbDateFormat(value = "yyyy-MM")
// Next one I'm guessing. Can't find docs for this.
@Schema(type = SchemaType.STRING, implementation = YearMonth.class, pattern = "yyyy-MM")
private YearMonth referencia;
环境:
- 野蝇 21
- Java 东南 11
- microprofile-rest-client-api:2.0
- microprofile-openapi-api:2.0
1. 首先,您需要启用 Jackson,因为 RESTEasy 默认为 JSONB。为此,您需要添加此 系统 属性:
- resteasy.preferJacksonOverJsonB = 真
添加系统 属性 作为您的偏好,使用 -Dproperty=value
命令行语法或其他。在我们的例子中,我们使用 WildFly 配置(例如 standalone.xml):
<system-properties>
<property name="resteasy.preferJacksonOverJsonB" value="true"/>
</system-properties>
2. 然后您可以将 Jackson 配置提供程序 添加到您的 REST 客户端界面:
import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
@RegisterProvider(JacksonConfiguration.class)
@RegisterRestClient
public interface RestTestService {
// methods...
}
现在,Java 8 日期时间 API 将正确序列化,如果需要,您可以使用 @JsonFormat
添加自定义格式。
另外:这里有一个 Jackson 配置提供程序的示例,它也可以在客户端和服务器端使用:
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
@Provider
public class JacksonConfiguration implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public JacksonConfiguration() {
mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}