摘要:中引入了模塊的概念,默認情況下,中將不再包含的包,而在時關于這個都是捆綁在一起的。
因為是初學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 都是捆綁在一起的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69475.html
摘要:的官方文檔中將調用的入口稱作,而在的示例代碼中將其命名為,其實指的是同一個東西。其次是類至此,一個文件上傳的服務端接口已經編寫完成。 前言 SpringBoot的官方文檔中關于Jersey的介紹并不是很全面: 27.3 JAX-RS and Jersey,SpringBoot-Sample項目里面也只有非常基礎的代碼,對于一些復雜的常用需求,這個文檔給不了任何幫助。 為了使用Jerse...
摘要:當不存在子類,也不存在子類時,規范中定義,在這種情況下,為服務動態生成一個名為的實例,并自動探測匹配資源。其中是中的基類,它繼承于情況二當不存在子類,但是存在子類時。以上就是規范中定義的四種服務的方式。 最近在學習 jersey 框架。他是 目前比較流行的 基于 JAX-RS 2.0 規范實現的 RESTful 框架。 我是跟著 《Java RESTful Web Service 實...
摘要:現在可以通過點擊指標檢查的指標,該數據是可用的格式。健康檢查被添加?,F在啟動,可以看到第步創建現在寫類,它負責創建博客條目。為了測試,做一個請求第步更新現在,更新方法來從獲取所有的博客文件。 編者注:我們發現了比較有趣的系列文章《30天學習30種新技術》,準備翻譯,一天一篇更新,年終禮包。下面是第十三天的內容。 我已經是一個使用了8年Java的軟件開發人員了,我寫過的大多數應用程...
摘要:一關于架構這詞是在他年的博士論文中提出的。具體的可以看構建實現的例子?;陧椖繉ο竽P偷母拍睿梢詮闹醒胄畔⒐芾眄椖康臉嫿?,報告和文檔。后續會繼續完善和版本的環境的搭建,以及基于容器項目部署。 一、關于RESTful架構 REST這詞是Roy Thomas Fielding在他2000年的博士論文中提出的。他利用REST定義了互聯網軟件的架構原則,即Representational S...
閱讀 2000·2021-09-13 10:23
閱讀 2332·2021-09-02 09:47
閱讀 3792·2021-08-16 11:01
閱讀 1214·2021-07-25 21:37
閱讀 1597·2019-08-30 15:56
閱讀 521·2019-08-30 13:52
閱讀 3127·2019-08-26 10:17
閱讀 2442·2019-08-23 18:17