gpt4 book ai didi

java - 如何覆盖 JAX-RS 内容协商期间所做的决定?

转载 作者:搜寻专家 更新时间:2023-10-31 20:30:22 27 4
gpt4 key购买 nike

我正在使用 RESTEasy 2.2.1.GA 作为我的 JAX-RS 实现来创建一个客户端以连接到第三方服务提供商。 (Education.com 的 REST API,如果重要的话)

为了确保我没有错过重要的实现细节,这里有代码示例:

服务接口(interface)

@Path("/")
public interface SchoolSearch {

@GET
@Produces({MediaType.APPLICATION_XML})
Collection<SchoolType> getSchoolsByZipCode(@QueryParam("postalcode") int postalCode);
}

调用类

public class SimpleSchoolSearch {

public static final String SITE_URL = "http://api.education.com/service/service.php?f=schoolSearch&key=****&sn=sf&v=4";

SchoolSearch service = ProxyFactory.create(SchoolSearch.class, SITE_URL);

public Collection<SchoolType> getSchools() throws Exception {
Collection<SchoolType> schools = new ArrayList<SchoolType>();
Collection<SchoolType> response = service.getSchoolsByZipCode(35803);
schools.addAll(response);
return schools;

}
}

设置测试以进行此调用后,我执行并看到抛出以下异常。

org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException: Unable to find JAXBContext for media type: text/html;charset="UTF-8"

根据我的理解,通过阅读 RESTEasy/JAX-RS 文档,当响应返回给客户端时,在数据解码之前,确定(内容协商??)关于使用哪种机制用于解码。 (我想我们在这里谈论的是 MessageBodyReader,但我不确定。)从响应的主体来看,我看到返回的是格式正确的 XML,但是内容协商(通过 HTTP header content-type 确实是 text/html;charset ="UTF-8") 不允许 JAXB 解析文本。

我认为实现的行为是正确的,错误的是服务,但是,我不控制该服务,但仍想使用它。

所以说:

我对为什么抛出异常的理解正确吗?

我该如何解决?

是否有一个简单的一行注释可以强制 JAXB 解码数据,或者我是否需要实现自定义 MessageBodyReader? (如果这甚至是要实现的正确类)。

谢谢!

跟进:

我只是想发布我对 Eiden 的回答所做的一些更改。我使用他的代码和 Resteasy ClientExecutionInterceptor documentation 上提供的信息创建了一个 ClientExecutionInterceptor .我的最后一个类看起来像

@Provider
@ClientInterceptor
public class SimpleInterceptor implements ClientExecutionInterceptor {

@Override
public ClientResponse execute(ClientExecutionContext ctx) throws Exception {
final ClientResponse response = ctx.proceed();
response.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML);
return response;
}
}

最大的不同是添加了@Provider 和@ClientExecutionInterceptor 注释。这应确保拦截器已正确注册。

此外,为了完整起见,我为测试注册的拦截器略有不同。我用过:

        providerFactory.registerProvider(SimpleInterceptor.class);

最佳答案

我确定这个问题有多种解决方案,但我只能想到一个。

尝试使用 ClientExecutionInterceptor 设置内容类型:

public class Interceptor implements ClientExecutionInterceptor {

@Override
public ClientResponse<?> execute(ClientExecutionContext ctx) throws Exception {
final ClientResponse<?> response = ctx.proceed();

response
.getHeaders()
.putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML);

return response;
}

}

public void getSchools() throws Exception {
ResteasyProviderFactory.getInstance()
.getClientExecutionInterceptorRegistry()
.register( new Interceptor() );

SchoolSearch service =
ProxyFactory.create(SchoolSearch.class, SITE_URL);
}

关于java - 如何覆盖 JAX-RS 内容协商期间所做的决定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8197973/

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