【问题标题】:Spring Restfull Jax-RS annotation supportSpring Restfull Jax-RS 注释支持
【发布时间】:2014-10-22 00:20:37
【问题描述】:

我有以下类和 web.xml 文件。 spring框架是否支持@PATH@PUT@Consumes...等jax-rs注解?

换句话说,我可以使用@PATH 代替@RequestMapping

Java:

import org.springframework.stereotype.Controller;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;

@Controller
@Path("/register")
public class RegisterServices {
    @PUT
    @Path("/create")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces({"application/json"})
    public Response create(@Context HttpServletRequest requestContex,
                           @HeaderParam("Authorization") String authorization, 
                           String xMsisdn, String param) {}
}

web.xml

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

【问题讨论】:

    标签: java spring rest jax-rs


    【解决方案1】:

    不,你不能在 spring 中使用 javax.ws.* 注释。您可以将 resteasy 与 spring 一起使用。这很容易。如果你需要我可以提供一个例子。 (Jersey 和 CXF 也有很好的 JAX-RS 实现。)

    AFAIK Springsource 不知道为 JAX-RS 提供实现。所以如果你想使用 JAX-RS 中描述的特性,你不会直接从 spring 中获得它。但是你可以使用 spring 开发一个 REST Web 服务。那是一个不同的故事。在 SO 上发现了 question

    更新

    根据下面 PaulNUK 的回答,我需要澄清我的回答。一天结束的休息是一个规范,首先需要有人来实现它。

    问题清楚地问,我们是否可以替换注释,你不能这样做,除非你在你的类路径中添加一个像 Jersey 这样的外部依赖。该案例的实现由 Jersey 提供。

    因此,您永远无法使用 spring 实现的 JAX-RS 注解。

    【讨论】:

    • +1 好答案! Spring 还与 JAX-RS 的参考实现 Jersey 集成
    • 在这种情况下,我认为@PATH 注释是由 Jersey API 处理的
    • 是的。但与 RestEasy 集成一样,您可以将 Spring 服务注入 Jersey 控制器。正如 Maleenc 指出的那样,没有 JAX-RS 的 Spring 实现。您可以做的最好的事情是将 JAX-RS 实现(例如 Jersey 或 RestEasy)与 Spring 集成,以便为 JAX-RS 前端提供 Spring“后端”
    • 对不起,这是错误的——你可以在 Spring 中使用 javax,ws 注释。请看下面我的回答。 Spring boot 示例使用了多个 javax.ws 注释。
    【解决方案2】:

    只需将您的 JAX-RS(我正在使用 Jersey 2)注释放在一个类上,使用 @Component 注释该类以使其成为 Spring bean,并且您可以通过 Spring 依赖注入获得完整的 JAX-RS 支持。

    所以 Spring 并没有通过实现 JAX-RS 本身来重新发明轮子,而是非常容易地与 Jersey 集成。

    这是一个简单的 Spring 启动示例:

    http://spring.io/blog/2014/11/23/bootiful-java-ee-support-in-spring-boot-1-2

    【讨论】:

    【解决方案3】:

    如果您只想使用 Spring 框架开发 Web 服务,那么 Spring 提供了 Spring MVC。 Spring MVC 有自己的一组注解。例如“@RequestMapping”。 Spring MVC 甚至不遵守 JAX-RS 原则。

    有各种支持“JAX-RS”并可与 Spring 集成的开源框架(如 Jersey)。

    但是,如果您想将 Spring MVC 与 Jersey 进行比较,那么下面是比较。我个人支持 Jersey 而不是 SPring MVC,因为 Spring MVC 最初不是用于 Web 服务,而是用于 UI 应用程序。

    1. 不支持多个 @Controller 中的相同相对路径
    2. @ExceptionHandler 以控制器为中心
    3. 标准内容协商无法使用固定响应类型进行响应 (SPR-6937)
    4. JSR 303 bean 验证未在 @Controllers 中应用(SPR-6928,计划用于 3.1)
    5. 无法使用 Spring 格式化程序注释格式化响应(即日期)
    6. 您不能从异常处理程序返回 bean 并期望它根据传入的接受标头自动序列化为 xml 或 json。

    HTH...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多