2017-03-06 387 views
0

我是JAVA新手,我正在尝试做一个服务:我想用JAX-RS和Hibernate进行测试(JPA),这里的任务是使用JAX-RS将信息发送给另一个类来持久化一个对象Utilisateur,并且我已经得到了很多时间,然后就在我的数据库中使用JPA插入一个新对象之前的很长一段时间。当我空空我的主类的测试,我总是得到这个错误: 异常线程“main” javax.ws.rs.NotAllowedException:HTTP 405不允许的方法@POST异常在线程“main”javax.ws.rs.NotAllowedException:HTTP 405方法不允许

这里是我的课(我的主,我的使持久化对象的服务类,我的Utilisateur类(即将要被持久化的Object类),我的web.xml和我的persistence.xml)。我会还张贴在控制台上的错误代码:

我的主类(测试):

package clientREST; 

import java.io.IOException; 
import java.net.UnknownHostException; 
import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.WebTarget; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.UriBuilder; 

import modele.Utilisateur; 

public class ClientMain { 


    public static void main(String[] args) throws UnknownHostException, IOException, Exception { 

     /* String nom = null ; 
     String prenom = null; 
     String pseudo = null;   
     String email = null; 
     String password = null; 
     String message = null;*/ 

     String nom = "Vidal"; 
     String prenom = "Fabrice"; 
     String pseudo = "Doppio"; 
     String email = "[email protected]"; 
     String password = "vfd"; 
     String message; 

     Client client = ClientBuilder.newClient();  
     WebTarget cible = client.target(UriBuilder.fromPath("http://172.17.0.5:8080/creationprofiltestmain/")); 
     WebTarget ciblefinale = cible.path("service"); 
     System.out.println("ok"); 

     Utilisateur util = ciblefinale.queryParam("nom", nom) 
            .queryParam("prenom", prenom) 
            .queryParam("pseudo",pseudo) 
            .queryParam("email", email) 
            .queryParam("password", password) 

        .request(MediaType.APPLICATION_XML).get(Utilisateur.class); 

      System.out.println("ok 2"); 
      message = "Vous venez de créez votre profil Monsieur " +util.getNom()+ "."; 
      System.out.println(message + util.getNom() 
             +util.getPrenom() 
             +util.getPseudo() 
             +util.getEmail() 
             +util.getPassword()); 





    } 

} 

我的服务类:

package composants; 


import javax.persistence.EntityManager; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.PUT; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 
import javax.ws.rs.core.MediaType; 
import modele.Utilisateur; 
import ressources.FournisseurDePersistance; 

@Path("service") 
public class ServiceCreationProfil { 

    private String nom; 
    private String prenom; 
    private String pseudo; 
    private String email; 
    private String password; 
    private String message; 



    EntityManager em = null; 

    @POST 
    @Consumes(MediaType.APPLICATION_XML) 
    @Produces(MediaType.TEXT_PLAIN) 
    //@Path("/getutil") 
    public Utilisateur getUtil (@QueryParam("nom") String nom, 
           @QueryParam("prenom") String prenom, 
           @QueryParam("pseudo") String pseudo, 
           @QueryParam("email") String email, 
           @QueryParam("password") String password){ 


     Utilisateur util = new Utilisateur (nom, prenom, pseudo, email, password); 

     try { 

     em = FournisseurDePersistance.getInstance().fournir(); 
     em.getTransaction().begin(); 
     em.persist(util); 
     em.getTransaction().commit(); 
     em.close(); 

     } 
     catch (Exception e) { 
      em.getTransaction().rollback(); 
      e.printStackTrace(); 
      System.out.println(e); 
      message = "voila l'erreur :"+e; 
     } 
    // mettre un catch avec un try plus tard 


     return util; 
    } 

    //************************************** GETTERS ET SETTERS ET CONTRUSCTEUR ****************************************************** 


    public ServiceCreationProfil() { 
     super(); 
    } 


    public String getNom() { 
     return nom; 
    } 

    public void setNom(String nom) { 
     this.nom = nom; 
    } 

    public String getPrenom() { 
     return prenom; 
    } 

    public void setPrenom(String prenom) { 
     this.prenom = prenom; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public String getPseudo() { 
     return pseudo; 
    } 

    public void setPseudo(String pseudo) { 
     this.pseudo = pseudo; 
    } 

}

我Utilisateur类(即将坚持的):

package modele; 

import java.util.ArrayList; 
import java.util.List; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
@Entity 
@Table(name = "UTILISATEUR") 
public class Utilisateur { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id_user; 
    @Column(nullable = false) 
    private String nom; 
    @Column(nullable = false) 
    private String prenom; 
    @Column(nullable = false, unique = true) 
    private String pseudo; 
    @Column(nullable = false, unique = true) 
    private String email; 
    @Column(nullable = false) 
    private String password; 
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) 
    private List<Annonce> annonces = new ArrayList<>(); 

    public Utilisateur() { 
     super(); 
    } 
    //***************************************** TEST *********************************************** 


    //***************************************** TEST *********************************************** 

    public Utilisateur(String nom, String prenom, String pseudo, String email, String password) { 
     super(); 
     this.nom = nom; 
     this.prenom = prenom; 
     this.pseudo = pseudo; 
     this.email = email; 
     this.password = password; 
    } 

    public List<Annonce> getAnnonces() { 
     return annonces; 
    } 

    public void setAnnonces(List<Annonce> annonces) { 
     this.annonces = annonces; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public int getId_user() { 
     return id_user; 
    } 

    public void setId_user(int id_user) { 
     this.id_user = id_user; 
    } 

    public String getPseudo() { 
     return pseudo; 
    } 

    public void setPseudo(String pseudo) { 
     this.pseudo = pseudo; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getNom() { 
     return nom; 
    } 

    public void setNom(String nom) { 
     this.nom = nom; 
    } 

    public String getPrenom() { 
     return prenom; 
    } 

    public void setPrenom(String prenom) { 
     this.prenom = prenom; 
    } 

} 

我的persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
      <persistence-unit name="peuplement" transaction-type="RESOURCE_LOCAL"> 

     <class>modele.Utilisateur</class> 
     <class>modele.Annonce</class> 
     <class>modele.Type_annonce</class> 

     <properties> 
     <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> 
     <property name="javax.persistence.jdbc.user" value="derby"/> 
     <property name="javax.persistence.jdbc.password" value="derby"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:derby://172.17.0.2:1530/ppeDB;update=true"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSixDialect"/> 
     <property name="hibernate.max_fetch_depth" value="3"/>  
     <property name="hibernate.hbm2ddl.auto" value="update"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

我的web.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>Service REST creation profil</display-name> 
<servlet> 
<servlet-name>Jersey REST 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>composants</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>Jersey REST Service</servlet-name> 
<url-pattern>/*</url-pattern> 
</servlet-mapping> 

<persistence-context-ref> 
    <persistence-context-ref-name>peuplement</persistence-context-ref-name> 
    <persistence-unit-name>peuplement</persistence-unit-name> 
    <persistence-context-type>Transaction</persistence-context-type> 
    </persistence-context-ref> 
</web-app> 

错误代码:

ok 
Exception in thread "main" javax.ws.rs.NotAllowedException: HTTP 405 Method Not Allowed 
    at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:1023) 
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:819) 
    at org.glassfish.jersey.client.JerseyInvocation.access$700(JerseyInvocation.java:92) 
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:701) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444) 
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:697) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:420) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:316) 
    at clientREST.ClientMain.main(ClientMain.java:43) 

我在这个论坛很新,很抱歉,如果我错过了很多的东西,真的很抱歉。 测试完成后,我将制作一个GUI,将SERVICE和GUI与JSF(xhtml)连接起来。 正如你所看到的,我不是英语,对于这些错误感到抱歉。

+0

你的'persistence.xml'和'web.xml'是一样的..这没有任何意义 –

+0

糟糕,我犯了一个错误,我现在就去改变! – kenb

回答

2

此错误意味着您正试图使到不允许的方法请求在你的情况在服务器端

/存在,它GET,你正试图使一个GET请求,但你没有它在服务声明

您的客户端代码:

....request(MediaType.APPLICATION_XML).get(Utilisateur.class); 

和你的服务代码:

@POST 
@Consumes(MediaType.APPLICATION_XML) 
@Produces(MediaType.TEXT_PLAIN) 
//@Path("/getutil") 
public Utilisateur getUtil.... 

更改您的服务代码,请改用@GET。

备案:您正在使用REST动词不正确,因为POST应该用于ADD,因此您可能需要更改客户端代码以创建POST,而不是GET。但你必须改变@QueryParam。因为这不是如何在POST中传递参数

您可能需要检查此answer以在请求集中传递POST表单字段。

+0

所以我在行为上犯了一个大错,我现在要改变这些事情。谢谢 – kenb