我一直试图弄清楚如何使用JAX-RS很长一段时间.我从最基本的概念开始,然后逐渐理解注释风格的编程,@ Path,@ Get,@ Post等的含义.
据我所知,对于很多地方提到的内容,JAX-RS是一个专注于将Java注释应用于普通Java对象的框架(第27页,Bill Burke,RESTful Java).
然后我超越了这一点感到困惑.如果JAX-RS本身是一个定义处理注释的API以实现RESTful Web服务的框架,那么"JAX-RS的实现"的含义是什么,例如"Jersey"和"JBoos Resteasy".JAX-RS顶部的另一层?我们为什么需要它们?
有人能为我提供一些见解吗?非常感谢!!!
虽然这是一个古老的问题,但我仍然找不到能够做到这一点的答案.如果您发现我的任何陈述不正确,请更正.
我有一个Java Face应用程序并使用REST作为Web服务.我不认为Face与我的问题有任何关系.web.xml是:
<servlet>
<servlet-name>NDREST</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>com.bi.nd.webservice</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>NDREST</servlet-name>
<url-pattern>/nd/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
我在web.xml中有更多的servlet,因为它是一个与Trinidad等的Face应用程序.
在com.bi.nd.webservice包中,我的资源类是:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Produces(MediaType.APPLICATION_XML)
@Path("/hello")
public class TransactionResource
{
public TransactionResource()
{
}
@GET
@Produces(MediaType.TEXT_PLAIN)
public String itWorks()
{
return "Get is OK";
}
}
Run Code Online (Sandbox Code Playgroud)
我的类有一个@GET的事实足以将自己标识为资源类.
更别说所有其他复杂性了,我在Eclipse中用Ant编译了我的源代码,我在catalina.out文件中遇到了这个错误:
May 24, 2011 8:48:46 AM com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages: …Run Code Online (Sandbox Code Playgroud) 我正在创建宁静的Web服务,我想知道如何使用输入参数创建服务以及如何从Web浏览器调用它.
例如
@Path("/todo")
public class TodoResource {
// This method is called if XMLis request
@PUT
@Produces( {MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public Todo getXML() {
Todo todo = new Todo();
todo.setSummary("This is my first todo");
todo.setDescription("This is my first todo");
return todo;
}
Run Code Online (Sandbox Code Playgroud)
我可以使用http:// localhost:8088/JerseyJAXB/rest/todo调用它
我想创建一个类似的方法
@Path("/todo")
public class TodoResource {
// This method is called if XMLis request
@PUT
@Produces( {MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public Todo getXML(String x, String y) {
Todo todo = new Todo();
todo.setSummary(x);
todo.setDescription(y);
return todo;
}
Run Code Online (Sandbox Code Playgroud)
在基于肥皂的Web服务的情况下,我会像这样调用它
在编写RESTful Web服务时,如果我在客户端(当前是.NET胖客户端)上启用任何类型的缓存,我会遇到问题.默认情况下,Jersey不发送任何类型的缓存控制头,因此客户端会自动缓存大多数页面(这似乎是有效的行为).
我想让Jersey默认发送一个"no-cache"的缓存控件,然后特别是响应覆盖缓存控件.
有没有办法和泽西这样做?
我发现RESTeasy能够使用@NoCache注释来指定整个类的设置,但我没有找到与Jersey类似的东西.
我正在通过在资源上使用JAX-RS注释来开发使用CXF的Web服务.这些注释指定参数名称,默认值以及有效的输入和输出MIME类型.
能够在我的代码上运行一个javadoc-esque工具来生成这个接口的简明文档集是很好的,但我似乎找不到任何东西.
由javadoc本身生成的文档需要进行过多的修改,我真的想要了解JAX-RS注释的语义,并为想要使用我的服务的开发人员生成一些友好的东西.
我想使用Jersey在我的REST服务中实现自定义授权.此自定义授权检查方法的注释以及方法接收的实际参数.
我的jax-rs注释方法如下:
@GET
@Path("customers")
@Requires(Role.CustomerManager)
public Customer getCustomer(@ParseFromQueryString @CheckPermission final Customer customer) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这@ParseFromQueryString是一个注释,指示Jersey(通过Injectable提供程序)Customer从查询字符串中解组a .代码如下:
public class QueryStringCustomerInjectable implements Injectable<Customer> {
public Customer getValue() {
final Customer customer = new Customer();
// ... a UriInfo was injected using the @Context annotation
// ... extract parameters from QueryString and use setters
return customer;
}
}
Run Code Online (Sandbox Code Playgroud)
该@CheckPermission注释指示我的自定义authoriser该权限是对客户进行检查.有些用户可以访问某些客户的信息.类似地,@Requires注释扮演调用者应具有的角色.这些不是java的安全角色(字符串),而是它们是枚举值.
使用Jersey ResourceDebuggingFilter作为起点,我已经能够知道将调用哪个方法.但是,我仍然没有想出如何确定实际使用哪些参数来调用该方法.
在我的头脑中,我可以想到两个工作:
QueryStringCustomerInjectable,但这看起来有点草率.这会是一个做得太多的课.然而,我真的 …
我有一个使用JBoss AS 7.1的JAX-RS应用程序,以及包含Dates(java.util.Date)的POST/GET JSON和XML对象:
@XmlRootElement
@XmlAccessorType(XmlAccessField.FIELD)
public class MyObject implements Serializable
{
@XmlSchemaType(name = "dateTime")
private Date date;
...
}
Run Code Online (Sandbox Code Playgroud)
当我在get方法上使用@Produce("application/xml")时,objets被序列化为XML并且日期被转换为ISO-8601字符串(例如"2012-12-10T14:50:12.123 + 02:00") ).
但是,如果我在get方法上使用@Produce("application/json"),则JSON对象中的日期是时间戳(例如"1355147452530")而不是ISO-8601字符串.
如何配置JAX-RS实现(RESTEasy)以JSON格式将日期序列化为ISO-8601字符串而不是时间戳?
谢谢您的回答.
注意:我还尝试使用自定义JAX-RS提供程序为日期执行JSON序列化
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class CustomJsonDateProvider implements MessageBodyWriter<Date>
{
...
}
Run Code Online (Sandbox Code Playgroud)
这个提供程序似乎是由RESTeasy在JBoss初创公司注册的:
[org.jboss.jaxrs] Adding JAX-RS provider classes: package.CustomJsonDateProvider
...
[org.jboss.resteasy.cdi.CdiInjectorFactory] No CDI beans found for class package.CustomJsonDateProvider. Using default ConstructorInjector.
Run Code Online (Sandbox Code Playgroud)
但它永远不会被使用!
我正在学习使用JAX-RS进行一些安静的api开发,并且对我的资源类有一个问题.
我的理解是我的资源类应该是RequestScoped,但是,当它是RequestScoped时,我调用实体管理器的persist方法会抛出TransactionRequiredException.
如果我将我的资源类更改为无状态,那么一切都很好,实体管理器可以保持没有任何问题.
我仍然是JavaEE的新手,想知道为什么会发生这种情况以及@Stateless注释会使持久化上下文正确注入的内容.我还想知道JAX-RS资源类是否是无状态而不是RequestScoped是否有任何问题,因为我见过的大多数教程都有.
我在下面列举了一些示例代码来说明.
@Path("Things")
//@Stateless //works just fine when em.persist() is called
@RequestScoped //throws transactionrequiredexception when em.persist() is called
public class ThingsResource{
@PersistenceContext(unitName = "persistenceUnitName")
EntityManager em;
public ThingsResource() { }
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response postThing(ThingDTO thing){
ThingEntity newThing = new ThingEntity(thing);
em.persist(newThing);
em.flush();
return Response.created(new URI("/" + newThing.getId()).build();
}
}
Run Code Online (Sandbox Code Playgroud) 我计划使用spring 4和java 7为复杂的高性能导向应用程序构建一个ResT完整Web服务.经过研究,我发现了以下选项.
我的选择是Spring WS,但Spring MVC REST不符合JAX-RS(如果我没有错).源 - Spring MVC REST不符合JAX-RS.有关系吗?
题: