admin管理员组

文章数量:1399898

I am trying to make post request to jersey test method. But I am always getting an error and have no idea, what is wrong. I am using Tomcat.

Java code:

@Path("/users")
public class UsersResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayHello() {
    return "Hello Jersey Today";
}

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String createUser(User us)
{
    //System.out.println("userdata " + us);
    User user = new User("testUserName", "testPassword");
    return user.toJson();
}
}

User class:

import .google.gson.Gson;
import .google.gson.GsonBuilder;

public class User 
{
private String username;
private String password;

public User()
{
    super();
}

public User(String name, String pass)
{
    super();
    this.username = name;
    this.password = pass;
}

public User(String username)
{
    this.username = username;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

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

public String toJson()
{
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String json = gson.toJson(this);
    return json;
}
}

And js code:

$(function () {

main = {

    // Start updates
    start: function(){

        var user = {username: "test", password: "pass"};
        var encoded = $.toJSON( user );

        ajaxPost.ajaxRequest("TodoListing/rest/users", user,
                            function(data)
                            {
                                alert("success with data " + data);
                            }, 

                            function(jqXHR, textStatus, errorThrown) {
                            alert("error " + textStatus + "/" + errorThrown);
                            });

    }
},

// Ajax request.
ajaxPost = {
    ajaxRequest: function(service, data, successSelector, errorSelector) {
        $.ajax({
            type: 'POST',
            url: ajaxPost.serverURL + service,
            data: data,
            contentType: "application/json",
            dataType: "application/json",
            success: successSelector,
            error: errorSelector
        });
    },
    serverURL: 'http://localhost/',
};

});

JS always returns error without description(empty errorThrown) and jersey logs an error on request:

PM .sun.jersey.server.wadl.generators.WadlGeneratorJAXBGrammarGenerator attachTypes
INFO: Couldn't find JAX-B element for class java.lang.String

I am trying to make post request to jersey test method. But I am always getting an error and have no idea, what is wrong. I am using Tomcat.

Java code:

@Path("/users")
public class UsersResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayHello() {
    return "Hello Jersey Today";
}

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String createUser(User us)
{
    //System.out.println("userdata " + us);
    User user = new User("testUserName", "testPassword");
    return user.toJson();
}
}

User class:

import .google.gson.Gson;
import .google.gson.GsonBuilder;

public class User 
{
private String username;
private String password;

public User()
{
    super();
}

public User(String name, String pass)
{
    super();
    this.username = name;
    this.password = pass;
}

public User(String username)
{
    this.username = username;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

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

public String toJson()
{
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String json = gson.toJson(this);
    return json;
}
}

And js code:

$(function () {

main = {

    // Start updates
    start: function(){

        var user = {username: "test", password: "pass"};
        var encoded = $.toJSON( user );

        ajaxPost.ajaxRequest("TodoListing/rest/users", user,
                            function(data)
                            {
                                alert("success with data " + data);
                            }, 

                            function(jqXHR, textStatus, errorThrown) {
                            alert("error " + textStatus + "/" + errorThrown);
                            });

    }
},

// Ajax request.
ajaxPost = {
    ajaxRequest: function(service, data, successSelector, errorSelector) {
        $.ajax({
            type: 'POST',
            url: ajaxPost.serverURL + service,
            data: data,
            contentType: "application/json",
            dataType: "application/json",
            success: successSelector,
            error: errorSelector
        });
    },
    serverURL: 'http://localhost/',
};

});

JS always returns error without description(empty errorThrown) and jersey logs an error on request:

PM .sun.jersey.server.wadl.generators.WadlGeneratorJAXBGrammarGenerator attachTypes
INFO: Couldn't find JAX-B element for class java.lang.String
Share Improve this question edited May 12, 2012 at 14:02 Olga Dalton asked May 12, 2012 at 12:19 Olga DaltonOlga Dalton 8493 gold badges15 silver badges25 bronze badges 1
  • Try using Poster or curl instead of JS to make a request, so you can determine if it's really the server that's the problem. – Ryan Stewart Commented May 12, 2012 at 15:03
Add a ment  | 

2 Answers 2

Reset to default 7

I run into the same problem with jersey and grizzly getting the same error all the time. After 2 weeks of research it appears that this problem relates to CORS (cross domain) difficulties.

The solution that works for me was a filter that gives some additional information to the response header:

    import .sun.jersey.spi.container.ContainerRequest;
    import .sun.jersey.spi.container.ContainerResponse;
    import .sun.jersey.spi.container.ContainerResponseFilter;

    class CORSFilter implements ContainerResponseFilter {

        @Override
        public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
            // instead of "*" you should provide a specific domain name for security reasons
            response.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
            response.getHttpHeaders().add("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
            response.getHttpHeaders().add("Access-Control-Allow-Headers", "Content-Type");
            return response;
        }
    }

introducing the filter to grizzly:

    ...
    ResourceConfig rc = new ClasspathResourceConfig("my.resource.package");
    rc.getContainerResponseFilters().add(new CORSFilter());
    return GrizzlyServerFactory.createHttpServer("http://base_uri", rc);
    ...

Maybe you can adopt this to tomcat.

if you are using Glassfish server, then you need to set .sun.enterprise.overrideablejavaxpackages to JVM. Moreover there is a thread here:

MultivaluedMap exception

Hope this will help you.

本文标签: javaWhat is wrong with this requestStack Overflow