Bartos
Bartos

Reputation: 1037

Java API / Jersey put method

it's my first API in Java, so please, keep that in mind ;) I've got Controller.class where I'm keeping all my methods right now ( I will clean it later ;) ). As far as GET methods work perfectly I've got problem with PUT method when I want to create new user - it doesn't work. Any help please ? And advices cause - as I said - I'm newbie when it comes to API ;)

So this is my controller.class :

 @Path("/api")
public class Controller {

    List<Post> mBartoszPosts;
    List<Post> mFelipePosts;
    List<Post> mShawnPosts;
    List<Post> mDavidPosts;
    List<Post> mGraziellaPosts;
    List<Post> mAllPosts;


    List<User> mUsers;
    User bartosz;
    User felipe;
    User shawn;
    User david;
    User graziella;



      @Path("/user/{id}")
      @GET
      @Produces("application/json")
     public Response  getUser(@PathParam("id")int id) {
         setUpUsers();
         System.out.println("Liczba osob : " + mUsers.size());
         for(User user : mUsers) {
            if(id == user.getId()) {
                String result = user.toString();
             return Response.status(200).entity(user).build();
            }
         } 
        return null;
         }
      @Path("/post/{post_id}")
      @GET
      @Produces("application/json")
     public Response  getPost(@PathParam("post_id")int post_id) {
         setUpUsers();
         System.out.println("Liczba osob : " + mUsers.size());
         for(Post post : mAllPosts) {
            if(post_id == post.getId()) {
                String result = post.toString();
             return Response.status(200).entity(post).build();
            }
         } 
        return null;

         }
      @Path("/posts")
      @GET
      @Produces("application/json")
     public Response  getPosts() {
         setUpUsers();
         String response = new Gson().toJson(mAllPosts );
             return Response.status(200).entity(response).build();

         }

      @PUT
      @Path("user/new/{id}/{post}")
      @Consumes(MediaType.APPLICATION_XML)
      @Produces(MediaType.APPLICATION_XML)
      public Response updateEmployeeById(@PathParam("id") Integer id,@PathParam("post") String userPost) 
      {
          List<Post>userPosts = new ArrayList();
          Post post = new Post(99,userPost,"Bartosz");
          userPosts.add(post);
          User updatedEmployee = new User(id,"Bartek","Szlapa",userPosts);

          if(updatedEmployee.getName() == null) {
              return Response.status(400).entity("Please provide the employee name !!").build();
          }

          updatedEmployee.setId(id);
          updatedEmployee.setName(updatedEmployee.getName());
          System.out.println(updatedEmployee.getName());

          return Response.ok().entity(updatedEmployee).build();
      }

      public int maxValue(int array[]){
          int max = Arrays.stream(array).max().getAsInt();
          return max;
        }
}

As you see the last method is PUT and it doesn't work: Here is my test client :

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Client client = ClientBuilder.newClient( new ClientConfig().register( Controller.class ) );
        WebTarget webTarget = client.target("http://localhost:8080/JerseyDemos/rest").path("api").path("user").path("new").path("77");
        List<Post>userPosts = new ArrayList();
        Post post = new Post(99,"Bartek Szlapa","Testing post ...");
        userPosts.add(post);
        User emp = new User(99,"Bartek","Szlapa",userPosts);
        Invocation.Builder invocationBuilder =  webTarget.request(MediaType.APPLICATION_XML);
        Response response = invocationBuilder.put(Entity.entity(emp, MediaType.APPLICATION_XML));
        User user = response.readEntity(User.class);
        System.out.println(response.getStatus());
        System.out.println(user);
    }
}

And finally my error :

Exception in thread "main" org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/xml, type=class entities.User, genericType=class entities.User.
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:248)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:163)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1135)
    at org.glassfish.jersey.client.ClientRequest.doWriteEntity(ClientRequest.java:516)
    at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:498)
    at org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:384)
    at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:282)
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:278)
    at org.glassfish.jersey.client.JerseyInvocation.lambda$invoke$0(JerseyInvocation.java:753)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:229)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:414)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:752)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:445)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.put(JerseyInvocation.java:334)
    at test.Test.main(Test.java:33)

Thanks in advance for help!

Upvotes: 1

Views: 1029

Answers (1)

Vikas Sachdeva
Vikas Sachdeva

Reputation: 5803

It seems 2 problems in your client code -

  1. For removing this error, you should add jersey-media-jaxb JAR in your classpath. If you are using maven, add below dependency in your pom.xml -

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-jaxb</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    
  2. As per your PUT method API specification -

public Response updateEmployeeById(@PathParam("id") Integer id,@PathParam("post") String userPost) {

Your REST service needs only path parameter id and post. No other input is required. However, in your client code, you are sending User class object emp object while calling your API -

Response response = invocationBuilder.put(Entity.entity(emp, MediaType.APPLICATION_XML));

Since you are not receiving this emp object in your API, so this data will get lost. So, either you should update your API for accepting User class object in request or don't sent this object from your client code.

Upvotes: 1

Related Questions