我使用JAX-RS,Jersey和Grizzly编写了一个简单的REST服务器.这就是我启动服务器的方式:
URI baseUri = UriBuilder.fromUri("http://localhost/api")
.port(8081)
.build();
ResourceConfig rc = new PackagesResourceConfig("se.aioobe.resources");
HttpServer httpServer = GrizzlyServerFactory.createHttpServer(baseUri, rc);
Run Code Online (Sandbox Code Playgroud)
现在我需要使用基本HTTP身份验证来保护资源,我无法弄清楚如何执行此操作.
我可以从Grizzly切换到例如Jetty,如果它更容易让它工作,但我真的很重视Grizzly提供的简单配置/启动.
我已经阅读了很多教程.他们都提到了web.xml,但在我目前的配置中我没有.(我是否需要添加一个用于HTTP身份验证?)我发现了以下 问题,它们都没有任何帮助:-(
(此时不需要SSL.此时的身份验证只是为了防止公众在我们的测试版中偷看.)
TL; DR:如何向Jersey/Grizzly webapp添加基本HTTP身份验证?
我有一个简单的项目来测试JAX-RS服务.昨天我下载了jersey-1.7.1,并使用com.sun.jersey.api.container.httpserver.HttpServerFactory和com.sun.net.httpserver.HttpServer来创建一个http服务器来测试我在Eclipse中的服务(没有重载重量容器)
今天,我下载了最新的球衣罐(jaxrs-ri),缺少HttpServerFactory.看起来他们在1.7.1 => 2.0之间删除了类,但我在弃用部分找不到它.我在API部分看到了grizzly2类(也许这就是我现在应该使用的)但是jaxrs-ri bundle中的jar都没有提供这些类.我下载了jersey-grizzly 1.12 jar,但它只有com/sun/jersey/server/impl/container/grizzly2/GrizzlyContainer类,没有实现.
对善良的灵魂提出质疑
1 - 使用来自泽西下载页面的最新jaxrs-ri jar,如果不推荐使用1.7.1方式,建议使用命令行创建简单http服务器的方法.什么罐子下载/包括,也许是一个简短的代码示例?
2 - 关于使用java创建简单REST服务的整个文档是一个很大的混乱.那么你如何找到正确的信息呢?
(真的,这不是一个玩笑.也许这需要一个单独的博客文章 - 只看一塌糊涂,更改API,没有关于弃用功能的信息,实现差异,例如CXF vs. jersey,API 1.x vs API 2.0, Glassfish容器v xy与Tomcat,y版本x与y版本x2,servlet 3.0将拥有此文件,您是否正在扩展应用程序!)
更新
JDKHttp服务器的工作示例
package test.jersey;
import java.net.URI;
import com.sun.net.httpserver.HttpServer;
import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory ;
import org.glassfish.jersey.server.ResourceConfig;
public class ConsoleServerV2 {
static final String BASE_URI = "http://localhost:9099/";
public static void main(String[] args) throws Exception {
HttpServer server = null ;
ResourceConfig rc = new ResourceConfig(rest.Service.class);
URI endpoint = new URI(BASE_URI);
server = JdkHttpServerFactory.createHttpServer(endpoint,rc);
System.out.println("console v2.0 : Press …Run Code Online (Sandbox Code Playgroud) 我有一个maven项目,给出以下两个错误
无法安装JAX-RS(REST Web服务)2.0:尚未满足一个或多个约束.
JAX-RS(REST Web服务)2.0需要Java 1.7或更高版本.
我安装了JDK 1.6(我无法更改)
项目方面没有勾选JAX-RS.
项目方面有java 1.6设置.
项目方面有动态Web项目2.4集.
我有以下插件
声纳3.2.0 MercurialEclipse 2.10 EclEmma 2.2.1
pom.xml就是这个......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.pcmsgroup.v21.esi</groupId>
<artifactId>customerservice-war</artifactId>
<version>2.0.0-SNAPSHOT</version>
</project>
Run Code Online (Sandbox Code Playgroud)
web.xml是
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Customer Service</display-name>
</web-app>
Run Code Online (Sandbox Code Playgroud)
清理或"更新Maven项目"没有任何区别.
注意:这是在eclipse-jee-kepler-SR1-win32-x86_64中.注意:版本eclipse-jee-kepler-win32-x86_64不会给出错误.
注意:新工作区不会更改错误.
注意:我正在使用JDK.1.6.0_43
我在".log"文件中看到的与此相关的唯一错误是..
!ENTRY org.eclipse.osgi 2 1 2013-10-16 15:07:58.816!MESSAGE NLS未使用的消息:JaxrsProjectConfigurator_The_project_does_not_contain_required_facets in:org.eclipse.m2e.wtp.jaxrs.internal.messages
添加方面,不要让我应用它,因为它说我需要Java 1.7
JSR339(JSR339)声明"API将广泛使用注释,并将需要J2SE 6.0或更高版本"
有任何想法吗?
@Provider
public class JerseyExceptionMapper implements ExceptionMapper<JerseyException> {
@Override
public Response toResponse(JerseyException jerseyException) {
return Response.status(jerseyException.getErrorCode()).
entity(jerseyException.getJsonResponseObj()).
type(MediaType.APPLICATION_JSON).
build();
}
}
Run Code Online (Sandbox Code Playgroud)
当您在中使用<error-page>组件时,上面的代码会产生不需要的结果web.xml.例如,如果my Response.status设置为400而我的error-page组件定义<error-code>为400,则Web服务器会将请求重定向到中定义的位置web.xml.
这显然不是我想要的REST请求.我在StackOverflow上读了另一篇帖子,说明了请求被转移到的原因error-page是因为HttpServletResponse.sendError(400)设置了.该帖子说如果你设置了HttpServletResponse.setStatus(400),那error-page将被忽略.
如果这是真的,我不知道它是如何有用的,因为我没有实现Jersey代码.我看到的选项是调查Response类源代码,并可能重新实现status方法或其他Jersey代码.这里有一个简单的选择还是我缺少的东西?
从本质上讲,我的问题是:鉴于我正在使用Jersey for REST而我正在使用错误页面,我web.xml如何使用上面的代码而忽略了error-page仅用于Jersey代码?导致HTTP错误的任何其他代码都应该转到error-page.或者是否有其他解决方案不涉及error-page但将与我想要的工作相同?
不久之后,我用Java开发了一个只有1个GET资源的Restful服务.它是这样访问的:
获取http:// localhost:8080/my-project/customers/transactions
此GET请求返回所有客户事务.
现在,我有另一个项目请求,他们希望在同一个数据库中的不同模式中插入客户事务.我认为不是创建其他服务而是可以增强此服务,因为底层数据库是相同的,而且是关于客户事务.
所以,我在我的服务界面中创建了另一个方法,我createCustomerTransactions想将它命名为与我的GET请求相同,但是这个将是这样的POST:
POST http:// localhost:8080/my-project/customers/transactions
我使用Soap-UI测试了这个并且它可以工作.我的问题是做Restful的正确方法.可以让GET和POST同时具有相同的url,虽然它们会指向不同的实际方法吗?我不擅长名字,所以不能提出另一个更好的资源名称.
在我们的(遗留)代码库中,我们以不同的方式抛出WebApplicationExceptions.为了对我们如何处理异常做出一些命令 - 我想为这些WAE(和其他)创建一个ExceptionMapper.
然而,我意识到Jersey的ExceptionMapper只映射了未被实体抛出的WAE.
例如:
throw new WebApplicationException(Response.status(500).build());
Run Code Online (Sandbox Code Playgroud)
ExceptionMapper捕获此异常.
throw new WebApplicationException(Response.status(500).entity(WsResourceUtils.createWSResourceRestError(500, "bla")).build());
Run Code Online (Sandbox Code Playgroud)
ExceptionMapper不会捕获此异常.
两者都是从代码中的相同点抛出的.
这是我的ExceptionMapper:
@Provider
public class GeneralExceptionMapper implements ExceptionMapper<Throwable> {
private static final Logger logger = LoggerFactory.getLogger(GeneralExceptionMapper.class);
@Override
public Response toResponse(Throwable e) {
logger.error("Caught a WAE", e);
...
}
Run Code Online (Sandbox Code Playgroud)
是否有可能创建一个ExceptionMapper,即使它们的响应已经使用实体构建,它也会捕获WebApplicationExceptions?
我们正在使用Jersey 1.17.
谢谢.
我有一个ContainerResponseFilter,我试图在其中设置一个cookie如下:
@Override
public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException {
String cookieName = "ExampleCookie";
String cookieValue = "SomeData";
logger.info("Setting cookie " + cookieName + " with value " + cookieValue + " into cookies " + JsonUtils.objectToJson(containerResponseContext.getCookies()));
containerResponseContext.getCookies().put(cookieName, new NewCookie(cookieName, cookieValue));
}
Run Code Online (Sandbox Code Playgroud)
但这会产生以下错误:
Caused by: java.lang.UnsupportedOperationException: null
at java.util.AbstractMap.put(AbstractMap.java:203) ~[na:1.7.0_67]
Run Code Online (Sandbox Code Playgroud)
在这里设置cookie是不可能的?如果是的话,我该怎么做?
我正在尝试配置现有的应用程序以使用Swagger.该应用程序使用Resteasy 3和Jetty 9.2以及JAX-RS 3.
我的更改基于Swagger wiki上的解释.
我首先在build.gradle中添加了swagger 1.5.0,然后在名为SchedulerStateRest的资源上添加注释@Api和@ApiOperation.
下一步是编辑我的web.xml,以便使用Swagger的Servlet 在我的Application和Initialize Swagger中连接Swagger-Core.
我的问题是,当我启动我的应用程序,没有相应的资源,当我浏览发现/swagger.json或/swagger.yaml从HTTP://本地主机:8080.但是,启动Jetty并且现有服务正在运行且可用时,我没有收到任何错误.
我已经启用了Jetty日志但是我没有找到与我相关的信息(启动Jetty嵌入式的负责人是JettyStarter).
通过查找类似的问题,我发现有些人说在/ v1/api-docs上应该提供swagger内容,所以我尝试了不同的URL,但我总是遇到404错误.
最近,我发现了ben- manes的一个要点,用Resteasy 3 + Guice 4来配置swagger.我试图模仿它的配置,并根据Guice-servlet的解释推断出web.xml的配置,但我最终遇到的问题与上面说明的配置(没有可用的资源是预期的地址).
由于启动嵌入式Jetty时没有错误,我想知道问题是否与错误的地址无关.您知道如何列出Jetty实例上可用的"资源"吗?
我注意到Swagger维基上的解释是针对Resteasy 2.X. 这是否意味着Swagger与Resteasy 3.x不兼容?
调试的想法,建议等,欢迎解决问题;)
我正面临一个问题,即在后端使用jax-rs进行角度调整.crud非常简单,有些文本字段和图像字段.
我有代码工作上传图像:
@POST
@Consumes("multipart/form-data")
public Response uploadFile(MultipartFormDataInput input) {
...
}
Run Code Online (Sandbox Code Playgroud)
并在html层:
<form action="http://localhost:8080/app/api/user" method="post" enctype="multipart/form-data">
<p>
Choose a file : <input type="file" name="file" />
</p>
<input type="submit" value="Upload" />
</form>
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是如何在这一步中做到这一点:
@POST
@Consumes("multipart/form-data")
public Response save(MultipartFormDataInput input, MyEntity entity) {
...
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试从视图层调用上面的代码,那么wildfly会给出一个错误,该错误没有找到要与MyEntity参数绑定的数据.
[org.jboss.resteasy.core.ExceptionHandler] (default task-3) failed to execute: javax.ws.rs.NotSupportedException:
Could not find message body reader for type: class mypackage.MyEntity of content type: multipart/form-data;boundary=----WebKitFormBoundaryRXVvqLpZACPylNgS
Run Code Online (Sandbox Code Playgroud)
有谁知道我该怎么做?或者说我分两步走了吗?
我想创建一个Web应用程序,一旦客户端访问了某个URL(例如www.example.com/ping/hello)就可以"ping"客户端,以获得服务器和客户端之间的往返时间.通过"ping"请求,我的意思是一个简单的请求,带有来自服务器和客户端的时间戳,并发送回时间戳的响应.我希望如果可能的话,使用单个URL完成此活动.
流程是这样的:
到目前为止,我只能完成第一步和第二步,但不知道如何确保客户端再次转到相同的URL而不返回第一步.
我的服务器代码是这样的:
@GET
@Path("/helloping")
public Response getPingServerClient(@Context HttpServletRequest req) {
String result = Long.toString(System.currentTimeMillis());
return Response.status(200).entity(result).build();
//the code to receive the response from client containing timestamp
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?