我想使用JAX-RS构建RESTful Web服务(Jersey + Jackson,Jackson用于生成JSON).
我使用Glassfish 4.0作为服务器,netbeans作为IDE.
Web服务工作正常,但目前我没有任何身份验证.
所以现在我正在考虑散列密码的摘要验证,这样你就不需要以纯文本形式传输密码了.另外我想使用https,以便加密数据.
我理解了理论.但我不知道我怎么能用Glassfish在Netbeans中做到这一点.
我看到一些教程在glassfish的管理控制台中做了一些事情.但是,有没有办法在netbeans中做到这一点?我不能在部署应用程序时创建的netbeans中定义一个领域吗?
创建领域和东西之后.我想我需要在我的所有资源(WebServices)中注入某种经过身份验证的"用户"-Object.但我以前从未这样做过.我正在寻找一个很好的教程,它描述了我如何设置摘要认证,注入网络netbeans可以用netbeans做到这一点,这样我就能很好地理解它.
我正在尝试使用Jersey来创建RESTful API.我的pom.xml看起来像:
<!-- Jersey Library -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.18</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.18</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是Only one JAX-RS Application Class allowed.在Jboss中部署应用程序时我遇到了 异常.但是,这在tomcat的情况下非常有效.
堆栈跟踪:
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.unit."apiinterface.war".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit."apiinterface.war".POST_MODULE: JBAS018733: Failed to process phase POST_MODULE of deployment "apiinterface.war"
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:127) [jboss-as-server-7.2.0.Final-redhat-4.jar:7.2.0.Final-redhat-4]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_45]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_45]
at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_45]
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011232: Only one …Run Code Online (Sandbox Code Playgroud) 我已经考虑了一段时间,但无法将其环绕在我的脑海中。假设我有一个通过 REST 公开的任务系统。任务有自己的生命周期,例如:
CREATED -> ACTIVE -> PROCESSING -> CLOSED
| | |
| |-->ESCALATED-->|
|
--> DISMISSED
Run Code Online (Sandbox Code Playgroud)
现在使用POST我通过提供正文有效负载中的所有信息来创建任务。
但现在我只需要更改任务的状态,也许添加评论。所以从理论上讲,PUT是要走的路——它正在更新资源。但事情是这样的:
PUT: /tasks/{taskId}?action=activate 似乎是合法的 URI,但是该操作已经有一个请求参数,可用于更改资源的状态 - PUT负载怎么样?对于这个端点的用户发送 0 长度消息的请求是否直观?
更新:
也很抱歉我的英语不好。我的意思是 -仅使用 URI 参数通过PUT请求更改资源状态,而不使用 BODY (Content-Lenght:0) 因此 URI: /tasks/32/ ?action=CLOSED更改“Task " 状态从PROCESSING到CLOSED。
如果这是一个不好的做法 - 什么方法被认为是更好的做法?
首先,我是JPA和Jax-rs的新手,我正在努力开发一项休息服务.所以我创建了一个资源类并对其进行了注释.
@Path("/companies")
public class CompanyResource {
private EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("test");
@GET
@Produces({MediaType.APPLICATION_JSON})
public List<Company> getCompanies() {
EntityManager entityManager = entityManagerFactory.createEntityManager();
return new ArrayList<>();
}
@GET
@Path("{companyId}")
@Produces({MediaType.APPLICATION_JSON})
public Company getCompany(@PathParam("companyId") int id) {
return new Company();
}
}
Run Code Online (Sandbox Code Playgroud)
从我对每个客户端请求实例的jax-rs的理解CompanyResource,这意味着每次EntityManagerFactory创建新的,我想这不是一个好主意,因为我只需要它来创建实体管理器,这可能是仅使用它的一个实例完成.那么实现这个目标的正确方法是什么?或者可以为每个请求创建此工厂的新实例吗?
PS我已经看到一些例子,他们使用@Stateless注释并注入实体管理器,但我猜他们EJB在那里使用(我可能是错的),我现在不想深入EJB.
我正在使用Java EE - JAX-RS 2.0技术构建Mobile后端API.
由于大多数移动客户端消耗都是异步http调用
所以我的问题是: 我应该为所有JAX-RS资源使用异步功能吗?原因如果不是?
以下是模板Mobile Async API
@Path("/async_api")
public class AsyncResource {
@GET
@Path("/loadUsers")
@Produces(MediaType.APPLICATION_JSON)
public void loadUsers(@Suspended AsyncResponse asyncResponse) {
//TODO: ManagedExecutorService
new Thread(new Runnable() {
@Override
public void run() {
List users = loadBigUsers();
asyncResponse.resume(users);
}
private List loadBigUsers() {
return null; // Return big list
}
}).start();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
假设我有一个Web服务/一个使用某些HTTP标头参数调用的REST资源。resource方法构建一个复杂的数据对象(当前为POJO),并最终将其返回给客户端(通过Gson作为JSON,但这无关紧要)。
所以我有这个调用层次结构:
@Path(foo) ProjectResource @GET getProject()
-> new Project()
-> new List<Participant> which contains lots of new Participant()s
-> new Affiliation()
Run Code Online (Sandbox Code Playgroud)
如果我想Affiliation根据标题参数以英语或德语填充对象,则必须将其作为参数传递给链下。我想避免这样做。也许这从根本上讲是不可能的,但是感觉太不对了。所有这些对象仅存在于请求中,因此能够从任何地方访问与请求相关的信息是否方便?
我希望我可以例如定义一个CDI @RequestScoped对象,该对象会初始化自身(或由某些WebFilter填充),然后可以在可能需要的位置注入。
但是显然,这在POJO内部是行不通的,而且我也很难从请求范围的对象内部获取标头。
我已经阅读了许多关于EJB,JAX-RS上下文和CDI的SO问题/答案,但是我无法解决。
我期望太多了吗?传递参数确实是首选选项吗?
在JAX-RS(RestEasy)中,我想实现一个客户端过滤器,在发送请求之前修改标头,因此我不会为每次调用手动执行此操作.
目前我在接收端这样做是为了在到达资源之前拦截请求.
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
// read header
}
Run Code Online (Sandbox Code Playgroud)
现在我知道了(如果我错了,纠正我):
在接收端,ContainerRequestFilter可以在请求到达资源并获取请求之前使用.
但我想在客户端实现这一点,在请求发送到服务器之前修改标头.可以使用相同的服务器过滤器,还是有类似于客户端的东西?
我想将多个参数传递给我的方法.我该怎么做呢?我希望网址看起来像这样的http:// host/one/two/three/four
到目前为止,我有以下代码
@GET
@Produces({MediaType.APPLICATION_JSON})
@Path("/{one,two,three}")
public List<Person> getPeople(@PathParam ("one") String one, @PathParam ("two") String two, @PathParam ("three") String three){
String one = one;
String two = two;
String three = three;
}
Run Code Online (Sandbox Code Playgroud)
这是抓住params并将其传递给我的方法的正确语法吗?我见过@Path中使用的一些正则表达式,但我不明白.老实说,我真的只想抓住参数并尽可能将它们放入变量中.
如何下载由JAX-RS资源公开的zip文件并使用Angular2 final将其提供给用户?
我有一个服务,我想以几乎相同的方式在一些项目中消费.我想简化向这些项目发送数据和从这些项目接收数据的过程,因此我想创建一个客户端jar来处理打包和解包jaxrs响应/请求的过程,并将其包含在我的其他项目中.
但是,要使用任何jax-rs对象,我必须依赖于jax-rs的特定实现.在我的小客户端库中,我必须包含jersey(或resteasy或cxf)才能访问任何jax-rs导入.如果我将这个jar包含在我的任何其他项目中,他们也将被迫使用该休息实现.
有没有办法创建一个利用jax-rs对象的单个项目jar,它将使用消费容器的jax-rs实现,而不是只有许多几乎相同的客户端项目,只包含不同的jax-rs实现?
从本质上讲,我希望我的项目大战能够包含一个jar,它将处理打包和解包jax-rs rest对象,这些对象使用war项目使用的jax-rs的任何实现.