我想把Jackson的内容写成ObjectNode
一个字符串,其中UTF-8字符写成ASCII(Unicode转义).
这是一个示例方法:
private String writeUnicodeString() {
ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.getNodeFactory().objectNode();
node.put("field1", "Maël Hörz");
return node.toString();
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,此输出:
{"field1":"Maël Hörz"}
Run Code Online (Sandbox Code Playgroud)
我希望它输出的是:
{"field1":"Ma\u00EBl H\u00F6rz"}
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
我无法使用Jersey 2(2.7)和Jersey内置的HK2依赖注入来实现一个非常基本的单例类实现.我在Tomcat上运行它.
我的目标是创建将由各种Web服务方法使用的支持类的单例实例.我没有强烈的偏好在构造函数注入,方法注入和注释类成员之间(如下所示).
这是我要成为的单身人士课程:
package singletest;
import javax.inject.Singleton;
@Singleton
public class JustOne {
private int secretNumber = 0;
public void hitMe(int input) {
secretNumber += input;
}
@Override
public String toString() {
return String.format("{ \"secretNumber\": %s }", secretNumber);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的应用程序类:
package singletest;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;
@ApplicationPath("/*")
public class MainApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<>();
classes.add(TestResource.class);
return classes;
}
@Override
public Set<Object> getSingletons() {
Set<Object> singletons = …
Run Code Online (Sandbox Code Playgroud) 对于异步编程,Jersey(JAX-RS)提供了一个ConnectionCallback
在连接断开时执行的回调.来自泽西岛的文档:
由于某些异步请求可能需要很长时间来处理,因此客户端可能决定在恢复响应之前或者在完全写入客户端之前终止其与服务器的连接.为了处理这些用例,可以使用ConnectionCallback.只有在将响应写入后端客户端时,连接过早终止或丢失,才会执行此回调.请注意,成功写入响应并按预期关闭客户端连接时,不会调用此回调.
听起来不错,但我永远无法解决这个问题.
这是一些代码:
@GET
@Produces(MediaType.TEXT_PLAIN)
@ManagedAsync
@Path("/poll")
public void poll(@Suspended final AsyncResponse asyncResponse) {
asyncResponse.register(new CompletionCallback() {
@Override
public void onComplete(Throwable throwable) {
logger.info("onComplete called.");
}
});
asyncResponse.register(new ConnectionCallback() {
@Override
public void onDisconnect(AsyncResponse disconnected) {
logger.info("onDisconnect called.");
}
});
asyncResponse.setTimeout(POLL_TIMEOUT_SECONDS, TimeUnit.SECONDS);
asyncResponse.setTimeoutHandler(new TimeoutHandler() {
@Override
public void handleTimeout(AsyncResponse asyncResponse) {
logger.info("handleTimeout called.");
asyncResponse.resume(Response.status(Response.Status.OK).entity("TIMEOUT").build());
}
});
}
Run Code Online (Sandbox Code Playgroud)
显示的另外两个回调,CompletionCallback和TimeoutHandler,可以正常启动,但不会失败.如果达到指定的超时持续时间,则会触发TimeoutHandler.如果恢复AsyncResponse实例,则会触发CompletionCallback.
但是,使用ConnectionCallback,我可以关闭,终止或以其他方式停止连接到上面显示的Web服务的客户端,并且ConnectionCallback永远不会被触发.
我错过了什么吗?ConnectionCallback是否在泽西实施?(它在JAX-RS规范中是可选的,但Jersey文档谈论它就好像已经实现了.)
任何输入将不胜感激.
我有一个testng测试类套件,我通过 testng.xml 文件运行它。这工作正常。所有测试都是串行运行的,因此没有并行执行障碍。
我现在的目标是获取由一个测试类中的测试方法生成的状态(例如,customerId
由数据库插入生成的主键值)并将其传递给另一个测试类,以便第二个类中的测试方法可以根据该共享状态采取进一步行动(例如,使用customerId
第一类的值查找刚刚插入的客户)。
在单个类中的测试方法之间共享状态很容易,当然,通过类成员变量,但我不知道如何在测试类之间共享它。
我们使用 Jersey 服务器发送事件 (SSE) 来允许应用程序的远程组件侦听 Jersey/Tomcat 服务器引发的事件。这很好用。
然而,至关重要的是我们的服务器拥有当前连接的侦听器(我们的远程组件)的准确列表。为此,我们的服务器每五秒向每个调用者发送一条小消息(通过 eventOutput.write)。如果我们的远程组件在 SSE 连接时关闭,或者远程计算机在 SSE 连接时关闭,我们服务器的 eventOutput.write 会抛出如下所示的 ClientAbortException/SocketException 异常。这很完美:我们捕获异常,将该调用者标记为不再连接,然后继续。
现在,针对问题。正如我所提到的,如果我们的远程组件软件未运行,或者运行该软件的计算机已关闭,则 eventOutput.write 会引发异常。但是,在两种情况下,对不再连接的计算机调用 eventOutput.write 不会引发异常:1) 如果在调用者连接 SSE 时简单地拔出远程计算机的以太网电缆,以及 2) 如果当调用者通过 SSE 连接时,远程计算机中的网络适配器被关闭(即通过管理操作)。在这两种情况下,我们可以在几个小时内每五秒调用一次 eventOutput.write 到远程计算机,并且不会引发异常。这使得无法检测到远程计算机不再连接。
我看到 EventOutput (和 ChunkedOutput) 的方法和属性非常少,但我想知道是否有任何方法可以配置或使用它,从而在写入已通过以太网断开连接的远程计算机时引发异常电缆已拔出或网络适配器已关闭。
这是在 eventOutput.write 确实抛出我们想要的异常的情况下得到的(好/有用)异常:
org.apache.catalina.connector.ClientAbortException: null
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:371) ~[catalina.jar:7.0.53]
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:333) ~[catalina.jar:7.0.53]
at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:101) ~[catalina.jar:7.0.53]
at org.glassfish.jersey.servlet.internal.ResponseWriter$NonCloseableOutputStreamWrapper.flush(ResponseWriter.java:303) ~[jaxrs-ri-2.13.jar:2.13.]
at org.glassfish.jersey.message.internal.CommittingOutputStream.flush(CommittingOutputStream.java:292) ~[jaxrs-ri-2.13.jar:2.13.]
at org.glassfish.jersey.server.ChunkedOutput$1.call(ChunkedOutput.java:240) ~[jaxrs-ri-2.13.jar:2.13.]
at org.glassfish.jersey.server.ChunkedOutput$1.call(ChunkedOutput.java:190) ~[jaxrs-ri-2.13.jar:2.13.]
at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[jaxrs-ri-2.13.jar:2.13.]
at org.glassfish.jersey.internal.Errors.process(Errors.java:242) ~[jaxrs-ri-2.13.jar:2.13.]
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:347) ~[jaxrs-ri-2.13.jar:2.13.]
at org.glassfish.jersey.server.ChunkedOutput.flushQueue(ChunkedOutput.java:190) ~[jaxrs-ri-2.13.jar:2.13.]
at org.glassfish.jersey.server.ChunkedOutput.write(ChunkedOutput.java:180) ~[jaxrs-ri-2.13.jar:2.13.]
at com.appserver.webservice.AgentSsePollingManager$ConnectionChecker.run(AgentSsePollingManager.java:174) ~[AgentSsePollingManager$ConnectionChecker.class:na] …
Run Code Online (Sandbox Code Playgroud) java ×4
jersey-2.0 ×3
jersey ×2
asynchronous ×1
hk2 ×1
jackson ×1
jax-rs ×1
json ×1
singleton ×1
testng ×1
unicode ×1
utf-8 ×1
web-services ×1