1

I developed an messaging EJB application with its services that uses WILDFLY 9 server. Now the application is working and the database is fully functional, I am trying to develop a REST web-service for this app. So I created my RestActivator :

package tn.carmate.webservice;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;


@ApplicationPath("rest")
public class RestActivator extends Application {

}

and my messageRessources.java as follows

package tn.carmate.webservice;

import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import tn.esprit.pi.Services.Services;
import tn.esprit.pi.persistance.Message;

@Path("message")
@RequestScoped
public class MessageRessource {

    @EJB
    Services servicemessage;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{idreceiver}")
    public Response getMessageList(@QueryParam(value = "idreceiver") int idReceiver) {

        List<Message> message = servicemessage.getMessageList(idReceiver);
        return Response.status(Status.OK).entity(message).build();

    }

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Path("{idSrc/idDest/content}")
    public Response sendMessage(@QueryParam(value = "idSrc") int idSrc, @QueryParam(value = "idDest") int idDest,
            @QueryParam(value = "content") String content) {

        servicemessage.sendMessage(idSrc, idDest, content);
        return Response.status(Status.OK).build();
    }

    @DELETE
    @Path("{idm}")
    public Response deleteMessage(@QueryParam(value = "idm") int id) {
        servicemessage.deleteMessage(id);
        return Response.status(Status.OK).build();

    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{idSender/idReceiver}")
    public Response getConversation(@QueryParam(value = "idSender") int idSender,
            @QueryParam(value = "idReceiver") int idReceiver) {
        List<Message> conversion = servicemessage.getConversation(idSender, idReceiver);
        return Response.status(Status.OK).entity(conversion).build();

    }


    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{idR}")
    public Response returnInbox (@QueryParam(value = "idR")int idR){
        List<Message> listmessage = servicemessage.returnInbox(idR);
        return Response.status(Status.OK).entity(listmessage).build();
    }


    @DELETE
    @Path("{idc}")
    public Response deleteConversation(@QueryParam(value = "idc")int id){
        servicemessage.deleteConversation(id);
        return Response.status(Status.OK).build();
    }


}

but whenever I try to consume a service like this one I get this error:

enter image description here

This is the message Entity

package tn.esprit.pi.persistance;

import java.io.Serializable;
import java.lang.String;
import java.util.Date;
import javax.persistence.*;





/**
 * Entity implementation class for Entity: Message
 *
 */
@Entity(name="message")

public class Message implements Serializable {

/*     @EmbeddedId
    private MessageId Id; 
    */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;



    private String object;
    private String content;

    @Temporal(TemporalType.TIMESTAMP)
    private Date dateEmission;

    @ManyToOne
    private User sender;

    @ManyToOne
    private User receiver;


    private static final long serialVersionUID = 1L;



    public Message(User src, User dest, String content) {
        this.sender = src;
        this.receiver = dest;
        this.content = content;
        this.dateEmission = new Date();
    }

    public Message() {
        super();
    }


/*  public MessageId getId() {
        return Id;
    }public void setId(MessageId id) {
        Id = id;
    }  
    */

    public int getIdMessage() {
        return this.id;
    }


    public String getObject() {
        return this.object;
    }

    public void setObject(String object) {
        this.object = object;
    }

    public User getReceiver() {
        return this.receiver;
    }

    public void setReceiver(User reciver) {
        this.receiver = reciver;
    }

    public User getSender() {
        return this.sender;
    }

    public void setSender(User sender) {
        this.sender = sender;
    }

    public String getContent() {
        return this.content;
    }

    public void setContent(String content) {
        this.content = content;
    }   
    public Date getDateEmission() {
        return this.dateEmission;
    }

    public void setDateEmission(Date dateEmission) {
        this.dateEmission = dateEmission;
    }

}
user6904265
  • 1,938
  • 1
  • 16
  • 21
  • Please note that I get this error on the console when I test the REST 23:16:06,143 WARN [org.jboss.resteasy.core.ExceptionHandler] (default task-34) failed to execute: javax.ws.rs.NotFoundException: Could not find resource for full path: http://localhost:18080/CarMate-web/rest/message?idR – user3726967 Nov 21 '16 at 22:17
  • Because you have a path as idreceiver, I think that this should be the proper invocation: `http://localhost:8080/CarMate-web/rest/message/idereceiver?idreceiver=1` – Leonardo Nov 22 '16 at 06:48

1 Answers1

2

Double check your URL, I think it should be http://localhost:8080 not http://localhost:18080. Just a typo mistake.

Secondly, Application base path for restful services set to rest so url should be http://localhost:8080/CarMate-web/rest/message?idreceiver=1

Finally, idreceiver is a Query Parameter but @Path("{idreceiver}") treat it as path parameter.

So, In http://localhost:8080/CarMate-web/rest/message?idreceiver=1 Rest Endpoint expect a path variable after /message/{idreceiver}?idreceiver=1 as mentioned by @Leonardo in comments.

I would suggest any of below listed solutions:

  1. Remove @Path from method

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getMessageList(@QueryParam(value = "idreceiver") int idReceiver) {
    List<Message> message = servicemessage.getMessageList(idReceiver);
    return Response.status(Status.OK).entity(message).build();
    }
    

and use this URL: http://localhost:8080/CarMate-web/rest/message?idreceiver=1

  1. Or Change @Path("{idreceiver}") to @Path("idreceiver")

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("idreceiver")
    public Response getMessageList(@QueryParam(value = "idreceiver") int idReceiver) {
    List<Message> message = servicemessage.getMessageList(idReceiver);
    return Response.status(Status.OK).entity(message).build();
    }
    

and use this URL: http://localhost:8080/CarMate-web/rest/message/idreceiver?idreceiver=1

AsSiDe
  • 1,826
  • 2
  • 15
  • 24
  • You are right about the path of restful, however the port is 18080. Please note that I tried executing with http://localhost:18080/CarMate-web/rest/message?idreceiver=1 and still got the same 404 error – user3726967 Nov 21 '16 at 21:29