- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在我的 Jboss 中,我尝试使用 JAX-RS 实现 REST 服务。它应该返回某个对象的 JSON 序列化版本
@GET
@Produces({ MediaType.APPLICATION_JSON })
public BlacklistDTO getByName(
@QueryParam("gav") final List<String> gavStringList)
{
...
}
对象的某些部分没有正确序列化(结果为空)。我如何处理/自定义 Jboss 生成 JSON 的方式?
最佳答案
您可以自定义实用程序的配置以序列化/反序列化 JSON(通常是 EAP 中包含的 Jackson),并配置/注册模块到 Jackson,指示如何对复杂对象执行此工作。
如果您使用的是 CDI + Resteasy + Jackson,您可以:
提供一个 JAX-RS 自定义 Json 提供程序,您可以在其中使用自定义配置配置 Jackson ObjectMapper。例如。
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class CustomJsonProvider implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public CustomJsonProvider() {
ObjectMapper mapperCdi = null;
//if you are using CDI and you have your own Custom Object Mapper...
BeanManager bm = CDI.current().getBeanManager();
Set<Bean<?>> sBeans = bm.getBeans(ObjectMapper.class);
if (sBeans != null && !sBeans.isEmpty()) {
@SuppressWarnings("unchecked")
Bean<ObjectMapper> bean = (Bean<ObjectMapper>) sBeans.iterator().next();
CreationalContext<ObjectMapper> ctx = bm.createCreationalContext(bean);
mapperCdi = (ObjectMapper) bm.getReference(bean, ObjectMapper.class, ctx);
}
if (mapperCdi != null) {
mapper = mapperCdi;
}else {
//if you are not using CDI, you can create your own Custom Object Mapper or get it from a factory e.g you can do here AppConfig.getObjectMapperInstance() or create a new one
mapper = new ObjectMapper();
//eg. configuration of Hibernate 5 - Jackson Module
Hibernate5Module h5m = new Hibernate5Module();
h5m.configure(Hibernate5Module.Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS, true);
mapper.registerModule((com.fasterxml.jackson.databind.Module) h5m);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
mapper.setSerializationInclusion(Include.NON_NULL);
//eg. custom Jackson SimpleModule registration
SimpleModule module = new SimpleModule("PaginationModule") {
private static final long serialVersionUID = 1L;
@Override
public void setupModule(SetupContext context) {
context.addAbstractTypeResolver(
new SimpleAbstractTypeResolver().addMapping(Slice.class, SliceClientImpl.class));
context.addAbstractTypeResolver(
new SimpleAbstractTypeResolver().addMapping(Page.class, PageClientImpl.class));
}
};
mapper.registerModule(module);
}
}
@Override
public ObjectMapper getContext(Class<?> objectType) {
return mapper;
}
}
如果您使用 CDI,请定义您的“生产者”方法 (@Produce) 和您的 Jackson ObjectMapper 工厂:
@ApplicationScoped
public class AppConfig {
private static ObjectMapper objectMapper;
// Jackson Object Mapper
@Produces
public ObjectMapper createMapper() {
return AppConfig.getObjectMapperInstance();
}
public static ObjectMapper getObjectMapperInstance() {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
//eg. configuration of Hibernate 5 - Jackson Module
//Hibernate5Module h5m = new Hibernate5Module();
//h5m.configure(Hibernate5Module.Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS, true);
//objectMapper.registerModule((com.fasterxml.jackson.databind.Module) h5m);
//eg. configuration of Joda - Jackson Module
objectMapper.registerModule(new JodaModule());
objectMapper.setTimeZone(TimeZone.getDefault());
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.setSerializationInclusion(Include.NON_NULL);
//eg. custom Jackson SimpleModule registration
SimpleModule module = new SimpleModule("PaginationModule") {
private static final long serialVersionUID = 1L;
@Override
public void setupModule(SetupContext context) {
context.addAbstractTypeResolver(
new SimpleAbstractTypeResolver().addMapping(Slice.class, SliceClientImpl.class));
context.addAbstractTypeResolver(
new SimpleAbstractTypeResolver().addMapping(Page.class, PageClientImpl.class));
}
};
objectMapper.registerModule(module);
}
return objectMapper;
}
}
检查您的提供商是否已通过 Jax-rs/Resteasy 注册:
如果您的 jackson 配置未注册,请尝试将以下行添加到您的 web.xml 中的上下文中:
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>your.package.CustomJsonProvider</param-value>
</context-param>
有时,需要配置为服务提供者,添加一个文件“META-INF/services/javax.ws.rs.ext.Providers”(或者在 WEB-INF 中,具体取决于您使用 war 的包装类型, ear, jar, etc.) 内容如下:
your.package.CustomJsonProvider
以另一种方式,您可以返回一个String(或一个Response 对象),在您的服务中注入(inject)您的ObjectMapper(或您处理JSON 格式的实用程序)并创建/在返回语句之前序列化您的对象。
例如。使用 Json-b
@Path("/myservice")
public class MyService {
@POST
@Produces(MediaType.APPLICATION_JSON)
@Path("/resources")
public Response createJson(@FormParam("name") String name, @FormParam("surname") String surname) {
Response response;
User u = new User(name, surname);
Jsonb jsonb = JsonbBuilder.create();
String jsonString = jsonb.toJson(u);
response = Response.ok(jsonString).build();
return response;
}
}
例如。使用 json-b 以编程方式创建自定义 json
// Create Json and serialize
JsonObject json = Json.createObjectBuilder()
.add("name", "Falco")
.add("age", BigDecimal.valueOf(3))
.add("biteable", Boolean.FALSE).build(); String result = json.toString();
例如。使用 Jackson 以编程方式创建自定义 json
ObjectMapper mapper = new ObjectMapper();
ArrayNode arrayNode = mapper.createArrayNode();
ObjectNode objectNode1 = mapper.createObjectNode();
objectNode1.put("name", "Anna");
objectNode1.put("surname", "T");
arrayNode.add(objectNode1);
ObjectNode objectNode2 = mapper.createObjectNode();
objectNode2.put("name", "John");
objectNode2.put("surname", "X");
arrayNode.add(objectNode2);
String json = arrayNode.toString();
希望对您有所帮助。
关于java - 在 Jboss EAP 7.2.0.GA 中处理 JSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57759925/
我是 JBoss 的新手,发现了很多不同的术语 - JBoss EAP、JBoss Server、Wildfly、Jboss Web,以及很多不是最新的或针对旧版本的文档。 我从哪里开始了解 JBos
JBoss ESB 服务器之间有什么区别(可在此处获得:http://jbossesb.jboss.org/downloads/) 和 JBoss fuse ( http://www.jboss.or
我在我的 PC 上安装了 JBoss 4 到目录 C:\JBoss4 并将环境变量 JBOSS_HOME 设置为此目录: JBOSS_HOME=C:\JBoss4 我需要在同一台 PC 上安装 JB
我有一个 JBoss 服务器正在运行并且想要部署一个服务。 该服务连接到在以下 xml 文件中配置的数据库 jdbc:postgresql://localhost:543
jboss 中的超时是如何工作的?网络应用程序如何知道何时重定向到登录页面? 只是为了澄清! -我知道如何在 jboss 上配置超时。我的问题是,Jboss 如何知道 session 已超时以及何时超
使用JBoss Forge启动新项目时,默认情况下该项目是使用Maven构建系统创建的。我如何利用Forge 2. *的Gradle插件使用Gradle而不是Maven创建项目? % forge Us
当前配置: 正在运行的16个Pod,基于JBoss TCP的集群以及google ping发现。容器作为状态集部署在Kubernetes集群上。 没有负载的初始群集按预期运行,没有任何单个问题,但是当
我以为这将是一个 JBoss 常见问题解答,但我找不到它。 我想同时运行 JBoss 4 和 JBoss 5。我通过将端口的前导数字更改为 9 手动更改了 JBoss 5 服务器/默认实例上的所有端口
我们在 JBoss AS 6 上实现了一些服务作为我们希望迁移到 JBoss AS 7 的单例服务。 这些服务在 jboss-service.xml 文件中声明,该文件位于 EJB 包中,类似于以下代
例如,如何确定我的简单 JBoss 4.2.3 服务器正在监听端口 8080? 这是我最接近的一次,但这不起作用: MBeanServerConnection server = (MBeanServe
我正在尝试找到从语法上确定我的程序是在 Jboss 5 还是 Jboss 7 (eap-6.1) 上运行的最佳方法。到目前为止,我找到的方法是特定于 jboss 5 或 jboss 7 的,这不起作用
我在域模式下使用 JBoss 6.4.8 版本。我想通过 CLI 添加这 4 个系统属性: 1- /host=myserver/server-config=node/system-property=j
在 JBoss 4 中,您可以在文件中设置对象的部署顺序( .jar 、 .war 、 .sar 等...): conf/xmdesc/org.jboss.deployment.MainDeploye
概括地说,JBoss 5 的关闭有什么作用?如果我只是杀死 java 进程而不是优雅地关闭 JBoss,可能会出现什么问题? 对于我的应用程序来说,正常的 JBoss 5 关闭大约需要 6 分钟,这个
我最近在 CentOS 6.7 服务器上安装了 JBoss AS 7。 jboss as 工作正常。为了测试,我部署了一个 .war 文件并对其进行了测试,效果很好!但现在我尝试从我的台式电脑访问相同
我有 jboss 应用程序。并想自动测试部署。并希望将此任务作为项目添加到 Hudson 我的愿景基于以下阶段: 将我的应用程序放到 JBoss(复制耳朵、配置、库等) 运行 JBoss 我有一台 L
我对 JBoss 很陌生。目前我有一个需求,我需要在 JBoss 上部署应用程序(已经在 Tomcat 上运行)。我下载了 JBoss,但是版本 7 中的目录结构不同。 我正在运行 bin\stand
我是 JBoss AS 7 的新手。我尝试在 JBoss AS 7 上部署我的 war 文件,这似乎工作正常。我的问题是在哪里可以看到部署的内容。 我希望它像 Tomcat 一样,它应该有一个探索的
我使用多播方法在两个不同的 JBoss 服务器之间配置了集群。 当我启动两个 JBoss 服务器时,两个服务器都将连接。 一天后,我收到以下消息 server.log 中的群集开始显示错误 05:28
为了打开/关闭我们产品的跟踪-“类别”或“记录器”标签,我们应该在jboss-log4j.xml中使用什么? 默认情况下,JBoss在jboss-log4j.xml中使用“类别”。 但据我所知,不赞成
我是一名优秀的程序员,十分优秀!