成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

記錄第一次搭建基于JAX-RS的REST風(fēng)格DEMO

ybak / 2476人閱讀

摘要:中引入了模塊的概念,默認(rèn)情況下,中將不再包含的包,而在時(shí)關(guān)于這個(gè)都是捆綁在一起的。

因?yàn)槭浅鯇W(xué)REST風(fēng)格,所以并不打算馬上就用springMVC這些框架去實(shí)現(xiàn)restful,所以先用jersey搭建一個(gè)rest的demo上手玩玩,本文記錄了搭建所需要引入的jar包,以及搭建過(guò)程碰到的坑,希望能讓大家有所收獲,歡迎交流!

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 類(lèi)

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";


    /**
     * 無(wú)參簡(jiǎn)單調(diào)用
     *
     * @return
     */
    @GET
    @Path("/sayhello")
    @Produces(MediaType.TEXT_PLAIN)
    public String sayHelloWorld() {
        return "hello,world!";
    }

    /**
     * 帶參方法,多個(gè)參數(shù)用多個(gè)/{}引住
     *
     * @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形式返回一個(gè)user對(duì)象
     * 其中有多個(gè)方案可以注入對(duì)象的成員屬性值,如下例子:
     * 1、首先要在User類(lèi)注解@XmlRootElement
     * 2、可以注解@XmlElement給set方法,在new出User實(shí)例后,調(diào)用set方法注入屬性值
     * 3、可以注解@XmlElement給get方法,通過(guò)在構(gòu)造方法調(diào)用get方法獲取屬性值
     * 4、可以注解@XmlElement給set方法,通過(guò)在構(gòu)造方法調(diào)用set方法注入屬性值
     *
     * @return
     */
    @GET
    @Path("/getUserXml")
    @Produces("application/xml")
    public User getUserXml() {
        User user = new User("jams", "26", "programer", "4453");
        user.setJob("programer"); //對(duì)應(yīng)注釋1

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

    /**
     * 以xml形式返回一個(gè)user對(duì)象
     * 其中有多個(gè)方案可以注入對(duì)象的成員屬性值,如下例子:
     * 1、首先要在User類(lèi)注解@XmlRootElement
     * 2、可以注解@XmlElement給set方法,在new出User實(shí)例后,調(diào)用set方法注入屬性值
     * 3、可以注解@XmlElement給get方法,通過(guò)在構(gòu)造方法調(diào)用get方法獲取屬性值
     * 4、可以注解@XmlElement給set方法,通過(guò)在構(gòu)造方法調(diào)用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傳入?yún)?shù)方式
     * 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對(duì)象

package com.test;

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

/**
 * 以xml形式返回一個(gè)user對(duì)象
 * 其中有多個(gè)方案可以注入對(duì)象的成員屬性值,如下例子:
 * 1、首先要在User類(lèi)注解@XmlRootElement
 * 2、可以注解@XmlElement給set方法,在new出User實(shí)例后,調(diào)用set方法注入屬性值
 * 3、可以注解@XmlElement給get方法,通過(guò)在構(gòu)造方法調(diào)用get方法獲取屬性值
 * 4、可以注解@XmlElement給set方法,通過(guò)在構(gòu)造方法調(diào)用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");  //對(duì)應(yīng)注釋3
        setAge("26");  //對(duì)應(yīng)注釋3

        username = this.getUsername();  //對(duì)應(yīng)注釋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對(duì)象

package com.test;

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


/**
 * 以json形式返回一個(gè)user對(duì)象
 * 其中有多個(gè)方案可以注入對(duì)象的成員屬性值,如下例子:
 * 1、可以注解@JsonSetter給set方法,在new出UserJson實(shí)例后,調(diào)用set方法注入屬性值
 * 2、可以注解@JsonGetter給get方法,通過(guò)在構(gòu)造方法調(diào)用get方法獲取屬性值
 * 3、可以注解@JsonSetter給set方法,通過(guò)在構(gòu)造方法調(diào)用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");  //對(duì)應(yīng)注釋3
        setAge("26");  //對(duì)應(yīng)注釋3

        username = this.getUsername();  //對(duì)應(yīng)注釋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、搭建過(guò)程中遇到的問(wèn)題

在第一次跑起來(lái)的時(shí)候,項(xiàng)目可正常啟動(dòng),首頁(yè)也可以正常訪問(wèn),但是訪問(wèn)rest接口的時(shí)候就報(bào)錯(cuò),錯(cuò)誤如下:

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

找來(lái)找去沒(méi)發(fā)現(xiàn)那里有問(wèn)題,最后無(wú)意中發(fā)現(xiàn)原來(lái)是JAVAEE包的問(wèn)題,JAXB API是java EE 的API,因此在java SE 9.0 中不再包含這個(gè) Jar 包。java 9 中引入了模塊的概念,默認(rèn)情況下,Java SE中將不再包含java EE 的Jar包,而在 java 6/7/8 時(shí)關(guān)于這個(gè)API 都是捆綁在一起的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69475.html

相關(guān)文章

  • SpringBoot整合Jersey2.x實(shí)現(xiàn)文件上傳API

    摘要:的官方文檔中將調(diào)用的入口稱作,而在的示例代碼中將其命名為,其實(shí)指的是同一個(gè)東西。其次是類(lèi)至此,一個(gè)文件上傳的服務(wù)端接口已經(jīng)編寫(xiě)完成。 前言 SpringBoot的官方文檔中關(guān)于Jersey的介紹并不是很全面: 27.3 JAX-RS and Jersey,SpringBoot-Sample項(xiàng)目里面也只有非?;A(chǔ)的代碼,對(duì)于一些復(fù)雜的常用需求,這個(gè)文檔給不了任何幫助。 為了使用Jerse...

    andot 評(píng)論0 收藏0
  • JAX-RS 2.0 中 REST 四種服務(wù)類(lèi)型

    摘要:當(dāng)不存在子類(lèi),也不存在子類(lèi)時(shí),規(guī)范中定義,在這種情況下,為服務(wù)動(dòng)態(tài)生成一個(gè)名為的實(shí)例,并自動(dòng)探測(cè)匹配資源。其中是中的基類(lèi),它繼承于情況二當(dāng)不存在子類(lèi),但是存在子類(lèi)時(shí)。以上就是規(guī)范中定義的四種服務(wù)的方式。 最近在學(xué)習(xí) jersey 框架。他是 目前比較流行的 基于 JAX-RS 2.0 規(guī)范實(shí)現(xiàn)的 RESTful 框架。 我是跟著 《Java RESTful Web Service 實(shí)...

    bbbbbb 評(píng)論0 收藏0
  • Day 13: Dropwizard —— 非常棒Java REST服務(wù)器棧

    摘要:現(xiàn)在可以通過(guò)點(diǎn)擊指標(biāo)檢查的指標(biāo),該數(shù)據(jù)是可用的格式。健康檢查被添加?,F(xiàn)在啟動(dòng),可以看到第步創(chuàng)建現(xiàn)在寫(xiě)類(lèi),它負(fù)責(zé)創(chuàng)建博客條目。為了測(cè)試,做一個(gè)請(qǐng)求第步更新現(xiàn)在,更新方法來(lái)從獲取所有的博客文件。 編者注:我們發(fā)現(xiàn)了比較有趣的系列文章《30天學(xué)習(xí)30種新技術(shù)》,準(zhǔn)備翻譯,一天一篇更新,年終禮包。下面是第十三天的內(nèi)容。 我已經(jīng)是一個(gè)使用了8年Java的軟件開(kāi)發(fā)人員了,我寫(xiě)過(guò)的大多數(shù)應(yīng)用程...

    Awbeci 評(píng)論0 收藏0
  • 利用Tomcat發(fā)布基于Maven所構(gòu)建Jersey RESTful Web Service

    摘要:一關(guān)于架構(gòu)這詞是在他年的博士論文中提出的。具體的可以看構(gòu)建實(shí)現(xiàn)的例子?;陧?xiàng)目對(duì)象模型的概念,可以從中央信息管理項(xiàng)目的構(gòu)建,報(bào)告和文檔。后續(xù)會(huì)繼續(xù)完善和版本的環(huán)境的搭建,以及基于容器項(xiàng)目部署。 一、關(guān)于RESTful架構(gòu) REST這詞是Roy Thomas Fielding在他2000年的博士論文中提出的。他利用REST定義了互聯(lián)網(wǎng)軟件的架構(gòu)原則,即Representational S...

    tianhang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<