java 在Quarkus中序列化后如何添加拦截器/过滤器

irtuqstp  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(530)

我想在Quarkus中序列化后添加一个拦截器(使用jsonb和resteasynotreactive)。
我知道如何实现ContainerResponseFilter,但是ContainerResponseContext包含了在序列化之前返回的 * 实体*(即Java对象),这不是我想要的。我的拦截器正在加密(使用自定义加密实用程序)序列化的JSON字符串,这意味着拦截器必须在序列化后运行。
我知道我可能会手动序列化响应,但我更喜欢使用现有的Quarkus工具。
编辑:WriterInterceptor似乎不起作用,因为它在**序列化发生之前被调用(加密需要在序列化的json字符串上发生)。

n53p2ov0

n53p2ov01#

您要查找的是WriterInterceptor,它允许您拦截作为HTTP响应的一部分返回的数据

sr4lhrrt

sr4lhrrt2#

简单的方法是覆盖jsonb反序列化。
创建一个所有需要加密的pojo都必须继承的接口:

package org.acme;

// All the pojos that needs encryption must inherit this
public interface EncryptedPojo {}

创建一个pojo:

package org.acme;

public class MyPojo implements EncryptedPojo {}

创建资源:

package org.acme;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public MyPojo hello() {
    return new MyPojo();
  }
}

创建jsonb反序列化的覆盖:

package org.acme;

import io.quarkus.jsonb.JsonbConfigCustomizer;
import jakarta.enterprise.context.Dependent;
import jakarta.enterprise.inject.Instance;
import jakarta.json.bind.JsonbConfig;
import jakarta.json.bind.serializer.JsonbSerializer;
import jakarta.json.bind.serializer.SerializationContext;
import jakarta.json.stream.JsonGenerator;

public class MyJsonBConfig {

  @Dependent
  JsonbConfig jsonConfig(Instance<JsonbConfigCustomizer> customizers) {
    JsonbConfig config = new JsonbConfig().withSerializers(new MySer());

    // Apply all JsonbConfigCustomizer beans (incl. Quarkus)
    for (JsonbConfigCustomizer customizer : customizers) {
      customizer.customize(config);
    }

    return config;
  }

  public class MySer implements JsonbSerializer<EncryptedPojo> {

    @Override
    public void serialize(EncryptedPojo pojo, JsonGenerator jsonGenerator, SerializationContext ctx) {
      if (pojo != null) {
        String encryptedPojo = encryptMyPojo(pojo);
        ctx.serialize(encryptedPojo, jsonGenerator);
      }
    }

    private static String encryptMyPojo(EncryptedPojo pojo) {
      return "My_encrypted_pojo";
    }
  }
}

并调用资源,例如。http://localhost:8080/hello
输出:

"My_encrypted_pojo"

相关问题