有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何解析资源在Restful Web服务中不可用

我已经用POST方法创建了REST Web服务“JSONService”(使用Jersey实现JAX-RS),并创建了“JerseyClientPost”。 我试图实现的是从我的JerseyClientPost发送邮件。将所有值放入一个“player”对象,并与响应一起发送回。但是当试图从邮递员那里发送POST请求时,它抛出

HTTP Status 404 - Not Found, The requested resource is not available.

如果有任何解决这个问题的建议,我们将不胜感激

请求Url:http://localhost:8080/WeekendSoccer/test/register/create

以下是我的环境详细信息: JDK 1.7.0_79, Tomcat服务器v7。0, 泽西岛(jaxrs-ri-2.25.1), 网状物xml

//下面给出了REST资源

package webService;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import dto.RegisterPlayer;

@Path("/register")
public class JSONService {
    @POST
    @Path("/create")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createPlayerInJSON(RegisterPlayer player) {     
        String result = "Player Created : " +player;
        return Response.status(201).entity(result).build();     
    }

}

//下面是泽西岛客户帖子

package dao;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

public class JerseyClientPost {
    public static void main(String[] args) {

        try {

            RegisterPlayer player = new RegisterPlayer();
            player.setName("Link");
            player.setEmail("link@test.com");
            player.setCompany("Test Ltd");  

            Client client = ClientBuilder.newClient(new ClientConfig().register( LoggingFilter.class ));
            WebTarget webTarget 
              = client.target("http://localhost:8080/WeekendSoccer/test");
            WebTarget playerWebTarget 
              = webTarget.path("/register/create");
            Invocation.Builder invocationBuilder 
              = playerWebTarget.request(MediaType.APPLICATION_JSON);

            Response response 
              = invocationBuilder
              .post(Entity.entity(player,MediaType.APPLICATION_JSON));          

            if (response.getStatus() != 201) {
                throw new RuntimeException("Failed : HTTP error code : "
                   + response.getStatus());
            }
            System.out.println(response.getStatus());
            System.out.println(response.readEntity(String.class));          


          } catch (Exception e) {

            e.printStackTrace();

          }

        }

}

//带有getter和setter的RegisterPlayer模型类

public class RegisterPlayer implements Serializable{    

    private String name;
    private String email;
    private String company; 

    public RegisterPlayer()
    {

    }

    public RegisterPlayer(String name, String email, String company)
    {
    super();

    this.name = name;
    this.email = email;
    this.company = company;

    }    

    public String getName()
    {
    return name;
    }
    public void setName(String name)
    {
    this.name = name;
    }
     ....
     }

//网络。xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>WeekendSoccer</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
<servlet>
<servlet-name>Register Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>webService</param-value>        
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Register Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>JSON Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>dao</param-value>        
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JSON Service</servlet-name>
<url-pattern>/test/*</url-pattern>
</servlet-mapping>
</web-app>

//列出了所有JAR

aopalliance-repackaged-2.5.0-b32.jar
gson-2.2.2.jar
hk2-api-2.5.0-b32.jar
hk2-locator-2.5.0-b32.jar
hk2-utils-2.5.0-b32.jar
jackson-annotations-2.3.2.jar
jackson-core-2.3.2.jar
jackson-databind-2.3.2.jar
jackson-jaxrs-base-2.3.2.jar
jackson-jaxrs-json-provider-2.3.2.jar
jackson-module-jaxb-annotations-2.3.2.jar
javassist-3.20.0-GA.jar
javax.annotation-api-1.2.jar
javax.inject-2.5.0-b32.jar
javax.servlet-api-3.0.1.jar
javax.ws.rs-api-2.0.1.jar
jaxb-api-2.2.7.jar
jersey-client.jar
jersey-common.jar
jersey-container-servlet-core.jar
jersey-container-servlet.jar
jersey-entity-filtering-2.17.jar
jersey-guava-2.25.1.jar
jersey-media-jaxb.jar
jersey-media-json-jackson-2.17.jar
jersey-server.jar
mysql-connector-java-5.1.40-bin.jar
org.osgi.core-4.2.0.jar
osgi-resource-locator-1.0.1.jar
persistence-api-1.0.jar
validation-api-1.1.0.Final.jar

共 (2) 个答案

  1. # 1 楼答案

    首先,我从未测试过您的客户端代码,但我想您的问题是关于服务器端的,并在Postman中进行了测试。您应该在pojo类RegisterPlayer中添加@XmlRootElement注释,如下所示:

    @XmlRootElement
    public class RegisterPlayer implements Serializable{    
    
        private String name;
        private String email;
        private String company; 
    
        public RegisterPlayer()
        {
    
        }
    
        public RegisterPlayer(String name, String email, String company)
        {
        super();
    
        this.name = name;
        this.email = email;
        this.company = company;
    
        }
    

    并在pom中添加了这些依赖项。xml

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.3</version>
    </dependency>
      <!  https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl  >
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>
    

    如果你已经有了这些罐子,那就好了。它现在对我有效。我希望这对你有帮助

    jackson-core-2.9.3.jar
    jackson-mapper-asl-1.9.13.jar
    jackson-core-asl-1.9.13.jar
    asm-3.3.1.jar
    jersey-bundle-1.19.4.jar
    jsr311-api-1.1.1.jar
    json-20170516.jar
    jersey-server-1.19.4.jar
    jersey-core-1.19.4.jar
    jersey-multipart-1.19.4.jar
    mimepull-1.9.3.jar
    jackson-annotations-2.7.0.jar
    jackson-databind-2.7.0.jar
    
  2. # 2 楼答案

    我仍然不确定,为什么在web中有以下映射。xml?因为没有任何servlet类与此servlet名称关联。你应该移除它们

    <servlet-mapping>
    <servlet-name>JSON Service</servlet-name>
    <url-pattern>/test/*</url-pattern>
    </servlet-mapping>
    

    我看到您有以下条目,它们确实关联了servlet类

    <servlet-mapping>
       <servlet-name>Register Service</servlet-name>
       <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    

    也就是说,您的目标url应该是

    http://localhost:8080/WeekendSoccer/rest/register/create
    

    而不是

    http://localhost:8080/WeekendSoccer/test/register/create