我正在运行一个Jboss服务器,其中包括一个JAX-RS Web服务(使用与Jboss/EAP捆绑在一起的resteasy-2.3.6.Final).
当客户端中止与服务器的呼叫时,RestEasy的SynchronousDispatcher
可以(显然)不发送响应返回给其造成了一堆错误的在客户端[SEVERE]
和[ERROR]
水平在我的服务器日志显示出来.
但是,我不认为这些是实际错误,所以我不想看到它们.特别是一旦服务将被公开使用,这必然会发生.
这是我想要抑制的日志输出:
12:50:38,938 SEVERE [org.jboss.resteasy.core.SynchronousDispatcher] (http-localhost/127.0.0.1:8080-2) Failed executing GET /ajax/findPerson: org.jboss.resteasy.spi.WriterException: ClientAbortException: java.net.SocketException: Broken pipe
at org.jboss.resteasy.core.ServerResponse.writeTo(ServerResponse.java:262) [resteasy-jaxrs-2.3.6.Final-redhat-1.jar:2.3.6.Final-redhat-1]
....
Caused by: ClientAbortException: java.net.SocketException: Broken pipe
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:403) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:356) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:426) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:415) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
...
Caused by: java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method) [rt.jar:1.7.0_51]
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) [rt.jar:1.7.0_51]
at java.net.SocketOutputStream.write(SocketOutputStream.java:159) [rt.jar:1.7.0_51]
at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:711) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:450) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:351) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
...
12:50:38,942 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/myapplication].[MyAjaxApplication]] (http-localhost/127.0.0.1:8080-2) JBWEB000236: Servlet.service() for servlet …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我正在构建的Java(JAX-RS)Web服务实现JSON Merge Patch.
要点是通过将JSON文档发送到仅包含应更改的字段的服务器来完成记录的部分更新.
鉴于此记录
{
"a": "b",
"c": {
"d": "e",
"f": "g"
}
}
Run Code Online (Sandbox Code Playgroud)
,以下JSON更新文档
{
"a":"z",
"c": {
"f": null
}
}
Run Code Online (Sandbox Code Playgroud)
应该为里面设置一个新值"a"
并删除."f"
"c"
后者是问题所在.我不知道如何区分f缺失的输入和f为null的输入.据我所知,两者都将null
在目标Java对象中反序列化.
做什么?
我有这样的网络服务:
@Path("/projects")
public class Projects {
[...]
@Inject
CurrentRequest current;
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{id}")
public Response getProject(@PathParam("id") String id) {
if (current.isUserAuthenticated()) {
[...do something...]
} else {
[...produce an error...]
}
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个带有auth checker方法的CDI bean,如下所示:
@RequestScoped
public class CurrentRequest {
public boolean isUserAuthenticated() {
[...do some header checking...]
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我不能为我的生活从内部抓住HTTP标头CurrentRequest
.我试过注射HttpServletRequest
,但它没有初始化.我试过用@Context
同样的东西.显然FacesContext.getCurrentInstance()
不起作用,因为没有FacesContext.
我看到这个问题基本上是在问同样的问题,但是没有得到太多的关注.
我目前的方法是使用@Context HttpServletRequest request
内部Projects
并将其作为参数传递给current.isUserAuthenticated(request)
.但那感觉很糟糕.CDI bean不应该知道它自己的请求吗?
我错过了什么?
我有一个在 Jboss 7 (EAP 6.4) 上运行的 EE6 JAX-RS 应用程序,并通过ExceptionMapper
.
不过,在某些情况下(最明显的是当 HTTP 基本身份验证失败时),由于错误发生在调用应用程序之前,因此不会调用此方法,因此客户端会获取服务器的默认错误页面(JBWEB bla bla,具有难看的紫色的 HTML) )。
现在为了捕获这些“外部”错误,我添加了<error-page>
定义,web.xml
如下所示:
<error-page>
<location>/error.json</location>
</error-page>
<error-page>
<error-code>401</error-code>
<location>/error401.json</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)
该位置工作正常,我几乎得到了我想要的响应,但 HTTP 状态代码始终为 200。
至少可以说,这很烦人。如何让错误页面返回正确的错误代码?
这相当简单。我有一个列表字段,可能存在也可能不存在(但必须与null
未初始化时不同),但是虽然我可以
List<String> mylist = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
我不能做
Optional<List<String>> mylist = Optional.of(new ArrayList<String>());
Run Code Online (Sandbox Code Playgroud)
因为类型不匹配。这是不幸的。我不想硬连线我的代码来使用 ArrayList。
有没有解决的办法?
假设我有一个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问题/答案,但是我无法解决。
我期望太多了吗?传递参数确实是首选选项吗?
java ×4
jax-rs ×3
cdi ×2
gson ×1
httprequest ×1
jakarta-ee ×1
java-8 ×1
jboss ×1
json ×1
option-type ×1
resteasy ×1
servlet-3.0 ×1