2016-04-07 7 views
0

Dies ist das erste Mal, dass ich mit Web Service, Jersey, Jackson und REST API arbeite. Ich habe einige Grundlagen des Web Service, Jersey, Jackson und REST API durchlaufen.Jersey REST API Anfrage funktioniert nicht

Ich habe ein Beispielprojekt mit Netbeans IDE entwickelt.

Wenn ich meine REST-API über meinen Browser aufruft, erhalte ich den folgenden Fehler, den ich mit Hilfe von Entwicklertools herausgefunden habe.

Anforderungs-URL: http://localhost:8080/ImageShowcase/v1/user/login

Anfrage Methode: GET

Statuscode: 405 Methode nicht

erlaubt

Remote-Adresse: 127.0.0.1: 8080

Im Folgenden ist der Fehler die ich bekam in Tomcat 7 Log

SEVERE: Ausnahme senden Kontextinitialisierung Ereignis zu li stener Instanz der Klasse com.sample.jersey.app.MyServlet

java.lang.IllegalStateException: Kann nicht API-Schlüssel und Geheimnis lokalisieren. Die Anwendung kann nicht initialisiert werden. Bitte stellen Sie sicher, dass Ihr API-Schlüssel und Geheim gespeichert in ~/.stormpath/apiKey.properties

Das ist meine Projektstruktur:

enter image description here

In dem Controller-Paket mir den folgenden Code User.java habe Paket com.sample.controller;

import com.sample.model.UserModel; 
import com.sample.pojo.UserCredentials; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

@Path("/user") 
public class User { 

    @Path("/login") 
    @POST 
    @Consumes("application/json") 
    @Produces("application/json") 
    public Response UserAuthentication(UserCredentials user) { 


     String output = "{\"username\":\"xyz\",\"password\":\"abc\"}"; 

     UserModel userAuthentication = new UserModel(); 
     if(userAuthentication.AuthenticateUser(user)) 
      return Response.status(201).entity(output).build(); 
     else 
      return Response.status(201).entity(output).build(); 
    } 
} 

Das folgende ist mein JerseyClient-Code

package com.sample.jerseyclient; 


import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.ClientResponse; 
import com.sun.jersey.api.client.WebResource; 

public class JerseyClient { 

    public static void main(String[] args) { 
    try { 
      System.out.println("Client started"); 
     Client client = Client.create(); 

     WebResource webResource = client 
      .resource("http://localhost:8080/ImageShowcase/v1/user/login"); 

     String input = "{\"username\":\"demo\",\"password\":\"demo\"}"; 
     // POST method 
     ClientResponse response = webResource.accept("application/json") 
       .type("application/json").post(ClientResponse.class, input); 

     // check response status code 
     if (response.getStatus() != 201) { 
      throw new RuntimeException("Failed : HTTP error code : " 
        + response.getStatus()); 
     } 

     // display response 
      String output = response.getEntity(String.class); 
     System.out.println("Output from Server .... "); 
     System.out.println(output + "\n"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 


    } 
} 

Nach meiner UserModel ist, wo ich meine bussiness-Logik (Datenbank, etc.) bin der Umsetzung.

package com.sample.model; 

import com.sample.pojo.UserCredentials; 
import java.sql.*; 

public class UserModel { 

    public boolean AuthenticateUser(UserCredentials user) { 
     Database db = new Database(); 
     Connection con = null; 

     try { 
      String username = user.getUsername(); 
      String password = user.getPassword(); 
      ResultSet rs; 

      con = db.getConnection(); 
      if (con != null) { 
       String selectQuery_UserDetails = "SELECT NAME,PASSWORD FROM USER WHERE NAME=? AND PASSWORD = ?"; 

       PreparedStatement preparedStatement = con.prepareStatement(selectQuery_UserDetails); 
       preparedStatement.setString(1, username); 
       preparedStatement.setString(2, password); 

       rs = preparedStatement.executeQuery(selectQuery_UserDetails); 
       if (rs != null) { 
        return true; 
       } 
       return false; 
      } 
     } catch (Exception e) { 
      return false; 
     } finally { 
      db.closeConnection(con); 
     } 
     return true; 
    } 
} 

Das ist meine POJO-Klasse für Benutzerdaten:

package com.sample.pojo; 

import org.codehaus.jackson.annotate.JsonProperty; 

public class UserCredentials { 

    @JsonProperty 
    private String username; 

    @JsonProperty 
    private String password; 


    public String getUsername() { 
     return username; 
    } 

    public String getPassword() { 
     return password; 
    } 
} 

ich nicht bekommen, was ich hier falsch mache. Eine andere Sache, die ich wissen möchte, ist, ob die Struktur, die ich verwende, korrekt ist oder nicht.

Danke.

+0

Sie bitte Ihre Frage aktualisieren. Beginnen Sie mit dem entsprechenden Code aus 'com.sample.jersey.app.MyServlet'. '~/.stormpath/apiKey.properties' ist ein Hinweis für Stormpath, aber hier ist nichts zu sehen.BTW, Anfrage Methode ist eigentlich POST nicht GET – zyexal

+0

Das ist der Teil, wo ich verwirrt bin und weiß nicht, warum es so zeigt, obwohl ich kein solches Paket hatte. Ist dies das Problem im Zusammenhang mit Build, weil ich vor der Implementierung meiner Lösung eine Beispielanwendung ausgeführt habe, die dieses Paket enthielt. Vielen Dank für Ihre Antwort. –

+0

Eine andere Sache, die ich wissen möchte, ist, wie man JerseyClient laufen lässt. Kann ich Postman verwenden, um alle diese APIs zu testen? –

Antwort

0

Obwohl dies ein ziemlich alter Thread ist, fühlte ich mich immer noch in meinen Gedanken, wenn es irgendjemanden nutzen könnte.

die folgenden Stellen Sie sicher, wird in web.xml gesetzt

<init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 
Verwandte Themen