gpt4 book ai didi

java - 是否可以使用 JAX-RS 设置 ETag 而无需求助于 Response 对象?

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:18 24 4
gpt4 key购买 nike

one of the few questions (with answers)我在 SO 上发现关于 JAX-RS 和缓存,生成 ETag(用于缓存)的答案是通过在 Response 对象上设置一些值。如下所示:

@GET
@Path("/person/{id}")
public Response getPerson(@PathParam("id") String name, @Context Request request){
Person person = _dao.getPerson(name);

if (person == null) {
return Response.noContent().build();
}

EntityTag eTag = new EntityTag(person.getUUID() + "-" + person.getVersion());

CacheControl cc = new CacheControl();
cc.setMaxAge(600);

ResponseBuilder builder = request.evaluatePreconditions(person.getUpdated(), eTag);

if (builder == null) {
builder = Response.ok(person);
}

return builder.cacheControl(cc).lastModified(person.getUpdated()).build();
}

问题是这对我们不起作用,因为我们对 SOAP 和 REST 服务使用相同的方法,方法是使用 @WebMethod (SOAP)、@GET(以及我们可能需要公开服务的任何其他方法)注释这些方法).以前的服务对我们来说是这样的(不包括标题的创建):

@WebMethod
@GET
@Path("/person/{id}")
public Person getPerson(@WebParam(name="id") @PathParam("id") String name){
return _dao.getPerson(name);
}

是否有任何方法 - 通过一些额外的配置 - 设置这些 header ?这是我第一次发现使用 Response 对象实际上比自动转换有一些好处......

我们正在使用 Apache CXF。

最佳答案

是的,如果您可以在创建响应对象后生成 E-tag,则可以使用拦截器来实现此目的。

public class MyInterceptor extends AbstractPhaseInterceptor<Message> {

public MyInterceptor () {
super(Phase.MARSHAL);
}

public final void handleMessage(Message message) {
MultivaluedMap<String, Object> headers = (MetadataMap<String, Object>) message.get(Message.PROTOCOL_HEADERS);

if (headers == null) {
headers = new MetadataMap<String, Object>();
}

//generate E-tag here
String etag = getEtag();
//
String cc = 600;

headers.add("E-Tag", etag);
headers.add("Cache-Control", cc);
message.put(Message.PROTOCOL_HEADERS, headers);
}
}

如果这种方式不可行,我会使用您发布的原始解决方案,并将您的 Person 实体添加到构建器中:

Person p = _dao.getPerson(name);
return builder.entity(p).cacheControl(cc).lastModified(person.getUpdated()).build();

关于java - 是否可以使用 JAX-RS 设置 ETag 而无需求助于 Response 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11317543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com