国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

記錄第一次搭建基于JAX-RS的REST風格DEMO

ybak / 2456人閱讀

摘要:中引入了模塊的概念,默認情況下,中將不再包含的包,而在時關于這個都是捆綁在一起的。

因為是初學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 都是捆綁在一起的。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/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服務器棧

    摘要:現在可以通過點擊指標檢查的指標,該數據是可用的格式。健康檢查被添加?,F在啟動,可以看到第步創建現在寫類,它負責創建博客條目。為了測試,做一個請求第步更新現在,更新方法來從獲取所有的博客文件。 編者注:我們發現了比較有趣的系列文章《30天學習30種新技術》,準備翻譯,一天一篇更新,年終禮包。下面是第十三天的內容。 我已經是一個使用了8年Java的軟件開發人員了,我寫過的大多數應用程...

    Awbeci 評論0 收藏0
  • 利用Tomcat發布基于Maven所構建Jersey RESTful Web Service

    摘要:一關于架構這詞是在他年的博士論文中提出的。具體的可以看構建實現的例子?;陧椖繉ο竽P偷母拍睿梢詮闹醒胄畔⒐芾眄椖康臉嫿?,報告和文檔。后續會繼續完善和版本的環境的搭建,以及基于容器項目部署。 一、關于RESTful架構 REST這詞是Roy Thomas Fielding在他2000年的博士論文中提出的。他利用REST定義了互聯網軟件的架構原則,即Representational S...

    tianhang 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<