资讯专栏INFORMATION COLUMN

记录第一次搭建基于JAX-RS的REST风格DEMO

ybak / 2305人阅读

摘要:中引入了模块的概念,默认情况下,中将不再包含的包,而在时关于这个都是捆绑在一起的。

因为是初学REST风格,所以并不打算马上就用springMVC这些框架去实现restful,所以先用jersey搭建一个rest的demo上手玩玩,本文记录了搭建所需要引入的jar包,以及搭建过程碰到的坑,希望能让大家有所收获,欢迎交流!

1、Maven jar包引入
 

    
    
      javax
      javaee-api
      7.0
      provided
    

    
      
    
      org.glassfish.jersey.core
      jersey-server
      2.23.2
    
    
      org.glassfish.jersey.core
      jersey-common
      2.23.2
    
    
      org.glassfish.jersey.containers
      jersey-container-servlet
      2.23.2
    
    
      org.apache.logging.log4j
      log4j-core
      2.11.0
      test
    

    
    
      org.glassfish.jersey.media
      jersey-media-moxy
      2.23.2
    

    
    
      org.glassfish.jersey.media
      jersey-media-json-jackson
      2.23.2
    
    
      com.fasterxml.jackson.core
      jackson-annotations
      2.8.1
    

    
    
      com.fasterxml.jackson.jaxrs
      jackson-jaxrs-xml-provider
      2.8.1
    

    
    
      javax.xml.bind
      jaxb-api
      2.3.0
    
    
      com.sun.xml.bind
      jaxb-impl
      2.3.0
    
    
      com.sun.xml.bind
      jaxb-core
      2.3.0
    
    
      javax.activation
      activation
      1.1.1
    
2、代码

rest api 类

package com.test;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.HashMap;

/**
 * test rest api
 */
@Path("/helloworld")
public class HelloWorld {
    private final String ROOT_NODE = "root";


    /**
     * 无参简单调用
     *
     * @return
     */
    @GET
    @Path("/sayhello")
    @Produces(MediaType.TEXT_PLAIN)
    public String sayHelloWorld() {
        return "hello,world!";
    }

    /**
     * 带参方法,多个参数用多个/{}引住
     *
     * @param userName
     * @param age
     * @return
     */
    @GET
    @Path("/{name}/{age}")
    @Produces("text/plain;charset=UTF-8")
    public String helloName(@PathParam("name") String userName, @PathParam("age") String age) {
        return "hello," + userName + ",你今年" + age + "岁";
    }

    /**
     * 以xml形式返回一个user对象
     * 其中有多个方案可以注入对象的成员属性值,如下例子:
     * 1、首先要在User类注解@XmlRootElement
     * 2、可以注解@XmlElement给set方法,在new出User实例后,调用set方法注入属性值
     * 3、可以注解@XmlElement给get方法,通过在构造方法调用get方法获取属性值
     * 4、可以注解@XmlElement给set方法,通过在构造方法调用set方法注入属性值
     *
     * @return
     */
    @GET
    @Path("/getUserXml")
    @Produces("application/xml")
    public User getUserXml() {
        User user = new User("jams", "26", "programer", "4453");
        user.setJob("programer"); //对应注释1

//        User user = new User();
//        user.setAge("25");
//        user.setIdcard("123");
//        user.setJob("pro");
//        user.setUsername("james");
        return user;
    }

    /**
     * 以xml形式返回一个user对象
     * 其中有多个方案可以注入对象的成员属性值,如下例子:
     * 1、首先要在User类注解@XmlRootElement
     * 2、可以注解@XmlElement给set方法,在new出User实例后,调用set方法注入属性值
     * 3、可以注解@XmlElement给get方法,通过在构造方法调用get方法获取属性值
     * 4、可以注解@XmlElement给set方法,通过在构造方法调用set方法注入属性值
     *
     * @return
     */
    @GET
    @Path("/getUserJson")
    @Produces(MediaType.APPLICATION_JSON)
    public UserJson getUserJson() {
        UserJson userJson = new UserJson("jams", "26", "programer", "4453");
        userJson.setJob("程序猿");
        return userJson;
    }

    /**
     * url传入参数方式
     * http://localhost:8080/mavenTest2/rest/helloworld/getMessage?from=10&to=100
     * @param from
     * @param to
     * @return
     */
    @GET
    @Path("/getMessage")
    @Produces({MediaType.APPLICATION_JSON})
    public HashMap getClientedMessage(@QueryParam("from") int from, @QueryParam("to") int to) {
        HashMap map = new HashMap();
        map.put("abc", "def");
        map.put("abc1", "" + from);
        map.put("abc2", "" + to);
        return map;
    }
}

xml格式的user对象

package com.test;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * 以xml形式返回一个user对象
 * 其中有多个方案可以注入对象的成员属性值,如下例子:
 * 1、首先要在User类注解@XmlRootElement
 * 2、可以注解@XmlElement给set方法,在new出User实例后,调用set方法注入属性值
 * 3、可以注解@XmlElement给get方法,通过在构造方法调用get方法获取属性值
 * 4、可以注解@XmlElement给set方法,通过在构造方法调用set方法注入属性值
 */
@XmlRootElement
public class User {

    private String username;
    private String age;
    private String job;
    private String idcard;

    public User() {
    }

    public User(String username, String age, String job, String idcard) {
//        username = this.username;
//        age = this.age;
//        job = this.job;
//        idcard = this.idcard;

//        this.setUsername("jams");
//        this.setJob("programer");
        this.setIdcard("445381");  //对应注释3
        setAge("26");  //对应注释3

        username = this.getUsername();  //对应注释2
//        age = this.getAge();
//        job = this.getJob();
//        idcard = getIdcard();
    }

    @XmlElement
    public String getUsername() {
        return "安德丽娜·朱莉";
    }
//    @XmlElement
    public String getAge() {
        return age;
    }
//    @XmlElement
    public String getJob() {
        return job;
    }
//    @XmlElement
    public String getIdcard() {
        return idcard;
    }

//    @XmlElement
    public void setUsername(String username) {
        this.username = username;
    }

    @XmlElement
    public void setAge(String age) {
        this.age = age;
    }

    @XmlElement
    public void setJob(String job) {
        this.job = job;
    }

    @XmlElement
    public void setIdcard(String idcard) {
        this.idcard = idcard;
    }
}

json格式的user对象

package com.test;

import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.annotation.JsonSetter;


/**
 * 以json形式返回一个user对象
 * 其中有多个方案可以注入对象的成员属性值,如下例子:
 * 1、可以注解@JsonSetter给set方法,在new出UserJson实例后,调用set方法注入属性值
 * 2、可以注解@JsonGetter给get方法,通过在构造方法调用get方法获取属性值
 * 3、可以注解@JsonSetter给set方法,通过在构造方法调用set方法注入属性值
 */
public class UserJson {

    private String username;
    private String age;
    private String job;
    private String idcard;

    public UserJson() {
    }

    public UserJson(String username, String age, String job, String idcard) {
//        username = this.username;
//        age = this.age;
//        job = this.job;
//        idcard = this.idcard;

//        this.setUsername("jams");
//        this.setJob("programer");
        this.setIdcard("445381");  //对应注释3
        setAge("26");  //对应注释3

        username = this.getUsername();  //对应注释2
//        age = this.getAge();
//        job = this.getJob();
//        idcard = getIdcard();
    }

    @JsonGetter
    public String getUsername() {
        return "安德丽娜·朱莉";
    }
    public String getAge() {
        return age;
    }
    public String getJob() {
        return job;
    }
    public String getIdcard() {
        return idcard;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @JsonSetter
    public void setAge(String age) {
        this.age = age;
    }

    @JsonSetter
    public void setJob(String job) {
        this.job = job;
    }

    @JsonSetter
    public void setIdcard(String idcard) {
        this.idcard = idcard;
    }
}

web.xml配置




Archetype Created Web Application
  
    javax.ws.rs.core.Application
    1
  
  
    javax.ws.rs.core.Application
    /rest/*
  

3、搭建过程中遇到的问题

在第一次跑起来的时候,项目可正常启动,首页也可以正常访问,但是访问rest接口的时候就报错,错误如下:

HTTP Status 500 – Internal Server Error
Type Exception Report

Message Servlet.init() for servlet [javax.ws.rs.core.Application] threw exception

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: Servlet.init() for servlet [javax.ws.rs.core.Application] threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:844)
Root Cause

java.lang.IllegalStateException: The resource configuration is not modifiable in this context.
    org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:274)
    org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:221)
    org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:453)
    org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:387)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:844)
Note The full stack trace of the root cause is available in the server logs.

Apache Tomcat/8.5.23

找来找去没发现那里有问题,最后无意中发现原来是JAVAEE包的问题,JAXB API是java EE 的API,因此在java SE 9.0 中不再包含这个 Jar 包。java 9 中引入了模块的概念,默认情况下,Java SE中将不再包含java EE 的Jar包,而在 java 6/7/8 时关于这个API 都是捆绑在一起的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69475.html

相关文章

  • SpringBoot整合Jersey2.x实现文件上传API

    摘要:的官方文档中将调用的入口称作,而在的示例代码中将其命名为,其实指的是同一个东西。其次是类至此,一个文件上传的服务端接口已经编写完成。 前言 SpringBoot的官方文档中关于Jersey的介绍并不是很全面: 27.3 JAX-RS and Jersey,SpringBoot-Sample项目里面也只有非常基础的代码,对于一些复杂的常用需求,这个文档给不了任何帮助。 为了使用Jerse...

    andot 评论0 收藏0
  • JAX-RS 2.0 中 REST 四种服务类型

    摘要:当不存在子类,也不存在子类时,规范中定义,在这种情况下,为服务动态生成一个名为的实例,并自动探测匹配资源。其中是中的基类,它继承于情况二当不存在子类,但是存在子类时。以上就是规范中定义的四种服务的方式。 最近在学习 jersey 框架。他是 目前比较流行的 基于 JAX-RS 2.0 规范实现的 RESTful 框架。 我是跟着 《Java RESTful Web Service 实...

    bbbbbb 评论0 收藏0
  • Day 13: Dropwizard —— 非常棒Java REST服务器栈

    摘要:现在可以通过点击指标检查的指标,该数据是可用的格式。健康检查被添加。现在启动,可以看到第步创建现在写类,它负责创建博客条目。为了测试,做一个请求第步更新现在,更新方法来从获取所有的博客文件。 编者注:我们发现了比较有趣的系列文章《30天学习30种新技术》,准备翻译,一天一篇更新,年终礼包。下面是第十三天的内容。 我已经是一个使用了8年Java的软件开发人员了,我写过的大多数应用程...

    Awbeci 评论0 收藏0
  • 利用Tomcat发布基于Maven所构建Jersey RESTful Web Service

    摘要:一关于架构这词是在他年的博士论文中提出的。具体的可以看构建实现的例子。基于项目对象模型的概念,可以从中央信息管理项目的构建,报告和文档。后续会继续完善和版本的环境的搭建,以及基于容器项目部署。 一、关于RESTful架构 REST这词是Roy Thomas Fielding在他2000年的博士论文中提出的。他利用REST定义了互联网软件的架构原则,即Representational S...

    tianhang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<