- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我创建了一个 JAX-RS 服务 (MyService),它有许多子资源,每个子资源都是 MySubResource 的子类。所选择的子资源类是根据 MyService 路径中给定的参数选择的,例如:
@Path("/") @Provides({"text/html", "text/xml"})
public class MyResource {
@Path("people/{id}") public MySubResource getPeople(@PathParam("id") String id) {
return new MyPeopleSubResource(id);
}
@Path("places/{id}") public MySubResource getPlaces(@PathParam("id") String id) {
return new MyPlacesSubResource(id);
}
}
其中 MyPlacesSubResource 和 MyPeopleSubResource 都是 MySubResource 的子类。
MySubResource 定义为:
public abstract class MySubResource {
protected abstract Results getResults();
@GET public Results get() { return getResults(); }
@GET @Path("xml")
public Response getXml() {
return Response.ok(getResults(), MediaType.TEXT_XML_TYPE).build();
}
@GET @Path("html")
public Response getHtml() {
return Response.ok(getResults(), MediaType.TEXT_HTML_TYPE).build();
}
}
结果由相应的 MessageBodyWriters 处理,具体取决于响应的 mimetype。
虽然这行得通,但它会产生像/people/Bob/html 或/people/Bob/xml 这样的路径,而我真正想要的是/people/Bob.html 或/people/Bob.xml
有人知道如何完成我想做的事情吗?
最佳答案
老话题,但这是我最近使用 Jersey 解决的问题;也许它会对其他人有所帮助。
Jersey 支持通过使用请求过滤器将接受的内容类型指定为 URI 中的文件扩展名。 Jersey 用品UriConnegFilter
(URI 内容协商过滤器)您扩展以将特定扩展转换为内容类型的对象。然后将该过滤器作为初始参数包含在 Jersey 应用程序中。
因为这听起来很模糊,下面是我项目中的一个具体示例:
我希望能够将 URL 末尾的“.json”和“.xml”解释为客户端分别需要 JSON 格式或 XML 格式的内容。为此,我像这样扩展了 UriConnegFilter
:
package my.filter.package;
import com.sun.jersey.api.container.filter.UriConnegFilter;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.core.MediaType;
public class MediaTypeFilter extends UriConnegFilter {
private static final Map<String, MediaType> mappedMediaTypes = new HashMap<String, MediaType>(2);
static {
mappedMediaTypes.put("json", MediaType.APPLICATION_JSON_TYPE);
mappedMediaTypes.put("xml", MediaType.APPLICATION_XML_TYPE);
}
public MediaTypeFilter() {
super(mappedMediaTypes);
}
}
然后,因为我将 Jersey 用作 Servlet,所以我将 MediaTypeFilter
添加到我的 web.xml 中:
<servlet>
<servlet-name>My Jersey Servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>my.resource.package</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.sun.jersey.api.container.filter.LoggingFilter;
my.filter.package.MediaTypeFilter;
com.sun.jersey.api.container.filter.PostReplaceFilter;
com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter;
com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
有了它,Jersey 将 URI 上的扩展名转换为指定的媒体类型,然后删除扩展名。这适用于根资源和子资源,因为它在整个 URI 上运行。对于您的特定示例,/people/Bob.xml 将变为/people/Bob 并且请求中的 Accept
header 将更改为“application/xml”(覆盖任何现有的 Accept
header )。
第,
-彼得
关于java - 如何在子资源 @Path 没有前导斜杠的情况下创建 JAX-RS 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2644622/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!