我有一个JAX-RS资源,它将其参数作为JSON字符串,如下所示:
http://some.test/aresource?query={"paramA":"value1", "paramB":"value2"}
在这里使用JSON的原因是查询对象在实际用例中可能非常复杂.
我想将JSON字符串转换为Java对象,在示例中为dto:
@GET 
@Produces("text/plain")
public String getIt(@QueryParam("query") DataTransferObject dto ) {
    ...
}
JAX-RS是否支持将JSON作为查询参数传递给Java对象的转换?
@XmlRootElement
public class Todo {
    private String s = "test";
    public String getS() {
        return s;
    }
    public void setS(String s) {
        this.s = s;
    }
}
和服务:
@Path("/test")
public class Service {
    @GET
    @Produces({MediaType.APPLICATION_JSON })
    public List<Todo> getAllGadgets() {
        return Arrays.asList(new Todo[] { new Todo() });
    }
}
我的web.xml:
<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.test</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
如果我将MediaType.APPLICATION_XML设置为生成注释,则所有这些都有效.但对于JSON,我得到以下异常:
严重:映射异常响应:500(内部服务器错误)javax.ws.rs.WebApplicationException:com.sun.jersey.api.MessageException:Java类java.util.Arrays $ ArrayList和Java类型java的消息体编写器找不到.util.List和MIME媒体类型application/json
我使用Jersey 1.6,根据教程,JSON格式应该可以在没有任何额外编程的情况下使用JAXB.怎么了?
是否可以将JAX-RS Web服务重定向到另一个网页?
就像你使用Servlet一样response.sendRedirect("http://test/test.html").
JAX-RS Web服务本身应该重定向.我正在使用RESTEasy,如果这是相关的.
我正在开发一个涉及谷歌AppEngine PAAS的移动和网络客户的项目.我想在我的AppEngine应用程序中使用RESTFul webservices.
我查看了Stackoverflow对RESTFul服务框架的引用,这些框架可以与AppEngine一起用于Web(GWT)和移动(Android)客户端.虽然Restlet似乎为AppEngine,GWT和Android提供了版本,但到目前为止,我已经把它归结RestEasy为主要是由于这个问题.
以前有过讨论RESTFul框架的问题,但我不认为比较适用于这个,现在很常见的情况.听取有经验的开发人员对可用于这组平台的框架的看法以及每个平台的优点和缺点将是有帮助的.
我正试图进入JAX-RS.我的项目jdk设置为1.7.03.是否必须为JAX-RS(javax.ws.rs)定义注释?如果没有,我可以在哪里找到它们?
我正在尝试使用Jersey和Glassfish Grizzly在java中编写REST服务.我有一个非常简单的内部工作案例,但似乎无法从外部地址调用服务器.我尝试过使用外部可见IP的各种不同的机器对,并尝试在服务器中指定实际的IP地址而不是localhost,但没有任何作用.我有点松散地遵循这里的官方用户指南.我的资源:
package resources;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/simpleREST")
public class SimpleRESTResource
{
    @GET
    @Produces("text/plain")
    public String getMessage()
    {
        return "Message from server\n";
    }
}
和服务器:
import java.io.IOException;
import java.net.URI;
import javax.ws.rs.core.UriBuilder;
import org.glassfish.grizzly.http.server.HttpServer;
import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
public class Main
{
    public static final URI BASE_URI = UriBuilder.fromUri("http://localhost").port(9998).build();
    public static void main(String[] args) throws IOException
    {
        System.out.println("Starting grizzly...");
        ResourceConfig rc = new PackagesResourceConfig("resources");
        HttpServer myServer = GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
        System.out.println(String.format("Jersey app started …我写了一个JAX-RS服务器,客户端都使用Jersey.我想将我的实体集合发送给客户端,我做了以下步骤:
我发出请求,它在服务器端成功处理客户端收到错误:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=interface java.util.List, genericType=java.util.List<model.HotelsEntity>.
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:225)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:149)
org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1124)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:853)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:812)
org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:377)
org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:813)
org.glassfish.jersey.client.JerseyInvocation.access$600(JerseyInvocation.java:90)
org.glassfish.jersey.client.JerseyInvocation$3.call(JerseyInvocation.java:693)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:228)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:689)
org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:405)
org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:301)
service.HotelService.getHotels(HotelService.java:30)
actions.HotelAction.perform(HotelAction.java:42)
MainServlet.processResponse(MainServlet.java:33)
MainServlet.doPost(MainServlet.java:22)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
服务器:
    @GET
@Produces(MediaType.APPLICATION_JSON)
public Response getHotelsList(@QueryParam("startDate") String startDate,
                              @QueryParam("endDate") String endDate) {
    List<HotelsEntity> list = hotelService.getAll();
    return ResponseFactory.response(Response.Status.OK, list);
}
客户:
    GenericType<List<HotelsEntity>> genericType = new GenericType<List<HotelsEntity>>(){};
    WebTarget target = client.target(preparePath());
    List<HotelsEntity> hotels = target.request(MediaType.APPLICATION_JSON_TYPE).get(genericType);
提供者:
public class JsonProvider<T> implements MessageBodyReader<T>, MessageBodyWriter<T> {
@Override …我正在向API请求并获取响应状态代码200.
api的json响应包括响应.
import javax.ws.rs.core.Response;
Response response = webclient.post(SomeReqString);
如何json从Web客户端响应中将响应检索为字符串?
典型的DropWizard应用程序指定一个Application子类,并覆盖其initialize方法,如下所示:
class MyApplication extends Application<MyConfiguration> {
    static void main(String[] args) {
        new MyApplication().run(args)
    }
    @Override
    public void initialize(Bootstrap<MyConfiguration> bootstrap) {
        // ???
    }
    @Override
    public void run(MyConfiguration configuration, Environment environment)
            throws Exception {
        // Register resources, health checks, etc.
    }
}
仔细阅读DropWizard文档以及JavaDocs:
Configuration -  YAML配置文件的对象表示.使用您自己的配置属性扩展它,它们也将从YAML文件中解析.Bootstrap - 预启动应用程序环境,包含引导Dropwizard命令所需的所有内容.Environment -  Dropwizard应用程序的环境.但这些是相当模糊的类定义,特别是最后两个.我理解我应该是子类Configuration,并且它代表我的应用程序的YAML/JSON配置文件的内存中POJO.
但我无法理解其他构造代表什么(Bootstrap和Environment).我习惯于在我的应用程序中注入特定于环境的配置,因此我倾向于将"环境"和"配置"的概念视为同一个概念.
此外,似乎DropWizard将Bootstrap实例与Configurationimpl实例紧密结合,但我找不到关于这两个类如何不同以及如何使用它们彼此不同的可证明的例子.
所以我问:
Bootstrap,我用它做什么用的?Environment,我用它做什么?我有一个RESTEasy Web服务器,有很多方法.我希望实现logback来跟踪所有请求和响应,但我不想添加log.info()到每个方法.  
也许有办法在一个地方捕获请求和响应并记录它.也许类似于RESTEasy上的HTTP请求流程链上的过滤器.
@Path("/rest")
@Produces("application/json")
public class CounterRestService {
    //Don't want use log in controler every method to track requests and responces
    static final Logger log = LoggerFactory.getLogger(CounterRestService.class); 
    @POST
    @Path("/create")
    public CounterResponce create(@QueryParam("name") String name) {
        log.info("create "+name)
        try {
            CounterService.getInstance().put(name);
            log.info("responce data"); // <- :((
            return new CounterResponce();
        } catch (Exception e){
            log.info("responce error data"); // <- :((
            return new CounterResponce("error", e.getMessage());
        }    
    }
    @POST
    @Path("/insert")
    public CounterResponce create(Counter counter) {
        try {
            CounterService.getInstance().put(counter);
            return new CounterResponce(); …