Dropwizard/Jersey和UTF-8中对资源的REST调用仅在开发人员计算机上有效

Dropwizard/Jersey和UTF-8中对资源的REST调用仅在开发人员计算机上有效,utf-8,jenkins,jersey,jetty,dropwizard,Utf 8,Jenkins,Jersey,Jetty,Dropwizard,我们正在使用dropwizard 0.7.1,它与jetty 9.0.7和jersey http客户端1.18.1一起提供(是的,它是旧的…)。操作系统是linux,我们使用的是Java1.8 我正在eclipse内部本地运行一个集成测试,它使用jersey对运行在vagrant box中的dropwizard应用程序进行rest调用 其中一个测试应该验证我是否可以向服务器发送非拉丁字符 我正在使用jersey在POJO的字符串字段中发送字符串“bаааааааааааааааа107 req.

我们正在使用dropwizard 0.7.1,它与jetty 9.0.7和jersey http客户端1.18.1一起提供(是的,它是旧的…)。操作系统是linux,我们使用的是Java1.8

我正在eclipse内部本地运行一个集成测试,它使用jersey对运行在vagrant box中的dropwizard应用程序进行rest调用

其中一个测试应该验证我是否可以向服务器发送非拉丁字符

我正在使用jersey在POJO的字符串字段中发送字符串“bаааааааааааааааа107

req.type(MediaType.APPLICATION_JSON + "; charset=utf-8")//            
   .post(ClientResponse.class, user);
我发送的资源也是这样的:

@Path("/users")
@Produces(MediaType.APPLICATION_JSON + "; charset=utf-8")
@Consumes(MediaType.APPLICATION_JSON + "; charset=utf-8")
public class UserServiceResource{

  [...]

  @POST
  public Response createUser(UserCreate user) {...}
database:
  driverClass: com.mysql.jdbc.Driver
  user: ...
  password: ...
  url: jdbc:mysql://...
  properties:
    charSet: UTF-8
    hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect
  maxWaitForConnection: 1s
  validationQuery: "/* DropWizard Health Check */ SELECT 1"
  minSize: 5
  maxSize: 25
  checkConnectionWhileIdle: false
  checkConnectionOnBorrow: true
(您可以看到,我们在客户端和服务器端都强制使用utf-8字符集,在我看来,这实际上是不必要的?)

这在本地非常有效,名称正确到达

但是,在jenkins上,这不起作用,我在服务中只收到“???????”而不是正确的字符。在发布pojo的客户机日志中,我仍然可以看到正确的字符

设置非常类似:jenkins构建了一个vagrant box,然后使用maven对该box运行测试(集成测试代码在vagrant box外部运行,服务在vagrant内部运行)

Jenkins使用maven,但是当使用maven在本地运行集成测试时,它仍然可以正常工作

我在本地使用的流浪者盒子也是由jenkins在另一份工作中构建和提供的

我们现在正试图调查环境设置是否与已尝试的设置略有不同

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
MAVEN_OPTS="-Dfile.encoding=UTF-8"
但那没用

主要让我困惑的是,我希望在任何环境设置下都能做到这一点,因为我们明确实施UTF-8。


知道环境如何覆盖客户端和服务器中设置的编码吗?

这个问题吞噬了我的灵魂。根本问题最终与JDBC配置有关。最初,我的配置如下所示:

@Path("/users")
@Produces(MediaType.APPLICATION_JSON + "; charset=utf-8")
@Consumes(MediaType.APPLICATION_JSON + "; charset=utf-8")
public class UserServiceResource{

  [...]

  @POST
  public Response createUser(UserCreate user) {...}
database:
  driverClass: com.mysql.jdbc.Driver
  user: ...
  password: ...
  url: jdbc:mysql://...
  properties:
    charSet: UTF-8
    hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect
  maxWaitForConnection: 1s
  validationQuery: "/* DropWizard Health Check */ SELECT 1"
  minSize: 5
  maxSize: 25
  checkConnectionWhileIdle: false
  checkConnectionOnBorrow: true
解决方案是更新
属性
块以定义
字符编码
使用Unicode
属性。像这样:

properties:
  charSet: UTF-8
  characterEncoding: UTF-8
  useUnicode: true
  hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect

此外,更新我的YAML配置为我解决了这个问题。

Jetty 9.0.7现在已经过时了。码头9.2.7为现有码头。自9.0.7以来,已经有几十个字符编码错误修复。我们将在今年更新到新的dropwizard版本,希望如此。但如果这是jetty中的一个bug,我想知道为什么在本地运行时它没有出现。更新到最新版本是否解决了这个问题?我发现Dropwizard 0.7.1Hm也存在同样的问题,我不记得了。我们最终升级到Dropwizard 8(我建议您这样做,这很痛苦,但之后您将停止编写遗留代码…)。这只是Jenkins的一个问题,但不是本地的,也不是生产中的,所以我想我们可能只是提交了一张罚单,但从来没有调查过。我无法检查这一点,因为我不再在这个项目中工作了,但这听起来像是解决方案,所以我接受了。谢谢:)