摘要:中引入了模块的概念,默认情况下,中将不再包含的包,而在时关于这个都是捆绑在一起的。
因为是初学REST风格,所以并不打算马上就用springMVC这些框架去实现restful,所以先用jersey搭建一个rest的demo上手玩玩,本文记录了搭建所需要引入的jar包,以及搭建过程碰到的坑,希望能让大家有所收获,欢迎交流!
1、Maven jar包引入2、代码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
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) { HashMapmap = 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配置
3、搭建过程中遇到的问题Archetype Created Web Application javax.ws.rs.core.Application 1 javax.ws.rs.core.Application /rest/*
在第一次跑起来的时候,项目可正常启动,首页也可以正常访问,但是访问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的官方文档中关于Jersey的介绍并不是很全面: 27.3 JAX-RS and Jersey,SpringBoot-Sample项目里面也只有非常基础的代码,对于一些复杂的常用需求,这个文档给不了任何帮助。 为了使用Jerse...
摘要:当不存在子类,也不存在子类时,规范中定义,在这种情况下,为服务动态生成一个名为的实例,并自动探测匹配资源。其中是中的基类,它继承于情况二当不存在子类,但是存在子类时。以上就是规范中定义的四种服务的方式。 最近在学习 jersey 框架。他是 目前比较流行的 基于 JAX-RS 2.0 规范实现的 RESTful 框架。 我是跟着 《Java RESTful Web Service 实...
摘要:现在可以通过点击指标检查的指标,该数据是可用的格式。健康检查被添加。现在启动,可以看到第步创建现在写类,它负责创建博客条目。为了测试,做一个请求第步更新现在,更新方法来从获取所有的博客文件。 编者注:我们发现了比较有趣的系列文章《30天学习30种新技术》,准备翻译,一天一篇更新,年终礼包。下面是第十三天的内容。 我已经是一个使用了8年Java的软件开发人员了,我写过的大多数应用程...
摘要:一关于架构这词是在他年的博士论文中提出的。具体的可以看构建实现的例子。基于项目对象模型的概念,可以从中央信息管理项目的构建,报告和文档。后续会继续完善和版本的环境的搭建,以及基于容器项目部署。 一、关于RESTful架构 REST这词是Roy Thomas Fielding在他2000年的博士论文中提出的。他利用REST定义了互联网软件的架构原则,即Representational S...
阅读 1953·2021-09-13 10:23
阅读 2288·2021-09-02 09:47
阅读 3744·2021-08-16 11:01
阅读 1187·2021-07-25 21:37
阅读 1545·2019-08-30 15:56
阅读 480·2019-08-30 13:52
阅读 3103·2019-08-26 10:17
阅读 2412·2019-08-23 18:17