我开始在JAX-RS中使用新的客户端API库,并且到目前为止真的非常喜欢它.我找到了一件我无法弄清楚的事情.我使用的API有一个自定义错误消息格式,例如:
{
"code": 400,
"message": "This is a message which describes why there was a code 400."
}
Run Code Online (Sandbox Code Playgroud)
它返回400作为状态代码,但还包含一条描述性错误消息,告诉您错误.
但是,JAX-RS 2.0客户端将400状态重新映射到通用的状态,我丢失了良好的错误消息.它正确地将它映射到BadRequestException,但具有通用的"HTTP 400 Bad Request"消息.
javax.ws.rs.BadRequestException: HTTP 400 Bad Request
at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:908)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:770)
at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:90)
at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:671)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:667)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:396)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:296)
Run Code Online (Sandbox Code Playgroud)
是否有某种拦截器或自定义错误处理程序可以注入,以便我可以访问真正的错误消息.我一直在查看文档,但看不到任何方法.
我现在正在使用Jersey,但是我尝试使用CXF并得到了相同的结果.这是代码的样子.
Client client = ClientBuilder.newClient().register(JacksonFeature.class).register(GzipInterceptor.class);
WebTarget target = client.target("https://somesite.com").path("/api/test");
Invocation.Builder builder = target.request()
.header("some_header", value)
.accept(MediaType.APPLICATION_JSON_TYPE)
.acceptEncoding("gzip");
MyEntity entity = builder.get(MyEntity.class);
Run Code Online (Sandbox Code Playgroud)
更新:
我实现了下面评论中列出的解决方案.它略有不同,因为类在JAX-RS 2.0客户端API中有所改变.我仍然认为默认行为是提供一般错误消息并丢弃真实错误消息是错误的.我理解为什么它不会解析我的错误对象,但应该返回未解析的版本.我最终得到了库已经执行的复制异常映射.
谢谢您的帮助.
这是我的过滤器类:
@Provider
public …Run Code Online (Sandbox Code Playgroud) 我一直试图围绕git分支模型.我一直在关注http://nvie.com/posts/a-successful-git-branching-model/以获取一些想法并从Subversion获得一件我真正期待的事情就是在一个地方进行改变将它合并到需要它的所有分支.在Subversion中,我们最终做了很多代码副本.
但是我仍然没有完全理解这一点.这是我所拥有的标准类型的工作流程,它总是会产生冲突.
# create new version branch
git checkout master
git checkout -b v3
vim pom.xml # change branch version to "3.1-SNAPSHOT"
git commit -a
git checkout master
vim pom.xml # change master version to "4.0-SNAPSHOT"
git commit -a
Run Code Online (Sandbox Code Playgroud)
因此主设备处于4.0-SNAPSHOT,分支处于3.1-SNAPSHOT.
不是我想在分支上创建一个修补程序并将其移动到主干.
git checkout v3
git checkout -b hotfix
vim file.txt # make a bugfix change
git commit -a
git checkout v3
git merge hotfix # this works fine
git checkout master
git merge hotfix # this has a …Run Code Online (Sandbox Code Playgroud) 我正在使用React.js与Bootstrap 3,我看到一个奇怪的渲染问题.
基本问题是,如果我使用引导类在直接HTML中显示一个表单,它看起来是正确的.但是,如果我从React组件中返回相同的标记,则控件之间缺少间距,它们都在触摸.两个版本之间的唯一区别是JSX中的"class"被"className"取代.
我把一个小样本放在一起以显示问题.
HTML
<div class="container">
<h3>In Raw HTML</h3>
<form class="form-inline" role="form">
<div class="form-group">
<label class="sr-only">Field 1</label>
<input class="form-control" placeholder="Field 1" />
</div>
<div class="form-group">
<label class="sr-only">Field 2</label>
<input class="form-control" placeholder="Field 2" />
</div>
<button type="submit" class="btn btn-primary">Apply</button>
<button type="button" class="btn">Reset</button>
</form>
<h3>In React Component</h3>
<div id="container"></div>
</div>
Run Code Online (Sandbox Code Playgroud)
使用Javascript
/** @jsx React.DOM */
var App = React.createClass({
render: function() {
return (
<form className="form-inline" role="form">
<div className="form-group">
<label className="sr-only">Field 1</label>
<input className="form-control" placeholder="Field 1" />
</div>
<div className="form-group">
<label …Run Code Online (Sandbox Code Playgroud) 我正在将Ant RestEasy项目转换为Maven.我有大部分时间再次运行,有一个问题.JSON输出不像以前那样工作.例如,这是一个获得输出的简单实体:
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "site-recode")
public class SiteRecode {
@XmlElement(name = "site", required = true)
protected String _site;
@XmlElement(name = "hist", required = true)
protected String _hist;
@XmlElement(name = "ks_and_meso", required = true)
protected Boolean _withKsAndMeso;
@XmlElement(name = "site-group", required = true)
protected String _siteGroup;
public SiteRecode() {
}
public SiteRecode(String site, String hist, Boolean withKsAndMeso, String siteGroup) {
this._site = site;
this._hist = hist;
this._withKsAndMeso = withKsAndMeso == null ? Boolean.TRUE : withKsAndMeso;
this._siteGroup = …Run Code Online (Sandbox Code Playgroud) 我有一个用JBoss编写的用Java编写的REST API.最近我们将JVM从1.6更新到1.7.这开始只引起我们连接的Python客户端的问题.间歇性地,Python客户端正在获得握手失败.我们写了一个非常简单的测试来重现问题:
import httplib2
for i in range(1,500):
print i
response, content = httplib2.Http(disable_ssl_certificate_validation=True).request('https://server.com:8443',)
Run Code Online (Sandbox Code Playgroud)
提供以下输出:
.
.
.
64
65
66
67
Traceback (most recent call last):
File "api_test/test.py", line 6, in <module>
response, content = httplib2.Http(disable_ssl_certificate_validation=True).request('https://server.com:8443/rest/solidtumor/2012/id/50d3216c092c8554b8b9f384?glossary=true&api_key=APIKEY',)
File "/home/hostovic/api_test/httplib2/__init__.py", line 1445, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File "/home/hostovic/api_test/httplib2/__init__.py", line 1197, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File "/home/hostovic/api_test/httplib2/__init__.py", line 1133, in _conn_request
conn.connect()
File "/home/hostovic/api_test/httplib2/__init__.py", line 914, …Run Code Online (Sandbox Code Playgroud) 过去几年我们一直在处理这个问题.我正在等待Gradle 3.0被释放以查看它是否会被修复但不幸的是它没有.问题是如果您在Gradle中使用并行构建,例如使用这些命令行标志:
--parallel --max-workers=20
Run Code Online (Sandbox Code Playgroud)
然后Gradle的调试非常冗长.我们的项目相当大,Findbugs正在添加超过10,000行日志消息.有些看起来像这样:
[:app:findbugsMain] Scanning archives (0 / 207)
[:app:findbugsMain] Scanning archives (1 / 207)
[:app:findbugsMain] Scanning archives (2 / 207)
[:app:findbugsMain] Scanning archives (3 / 207)
[:app:findbugsMain] Scanning archives (4 / 207)
[:app:findbugsMain] Scanning archives (5 / 207)
[:app:findbugsMain] Scanning archives (6 / 207)
[:app:findbugsMain] Scanning archives (7 / 207)
[:app:findbugsMain] Scanning archives (8 / 207)
[:app:findbugsMain] Scanning archives (9 / 207)
Run Code Online (Sandbox Code Playgroud)
然后其他人看起来像这样:
[:app:findbugsMain] Pass 1: Analyzing classes (446 / 662) - 67% complete
[:app:findbugsMain] Pass 1: …Run Code Online (Sandbox Code Playgroud) 我在尝试优雅地处理$ http错误时遇到问题.我循环遍历服务器列表以进行状态的API调用.成功完成的电话完美无缺.失败的那些不会让我访问错误信息.它总是未定义的.这是代码片段:
angular.forEach($scope.servers, function (server) {
// blank out results first
server.statusResults = {};
$http.jsonp(server.url + '/api/system/status?callback=JSON_CALLBACK', {headers: { 'APP-API-Key': server.apiKey }}).
success(function (data, status, headers, config) {
server.statusResults = data;
}).
error(function (data, status, headers, config) {
// data is always undefined here when there is an error
console.error('Error fetching feed:', data);
});
}
);
Run Code Online (Sandbox Code Playgroud)
控制台输出显示正确的401错误(我没有输出)和我的控制台错误消息(我输出)与未定义的数据对象.
GET https://server_address/api/system/status?callback=angular.callbacks._1 401 (Unauthorized) angular.min.js:104
Error fetching feed: undefined
Run Code Online (Sandbox Code Playgroud)
我想要做的是没有Angular在日志中显示401,而是我将以优雅的方式显示它.但是,由于数据未定义,我无法访问信息.
我是AngularJS的新手,但我的例子与我在文档中找到的其他示例非常匹配.
我也尝试使用$ resource而不是$ http,并得到完全相同的问题.
var statusResource = $resource(server.url + '/api/system/status', {alt: 'json', callback: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Morphia 中使用 MongoDB 全文索引。我需要返回每个文档的分数并对结果进行排序。这是我的查询在没有 Morphia 的情况下的样子:
db.getCollection('disease').find( { $text: { $search: "brain" } },
{ score: { $meta: "textScore" } } )
.sort( { score: { $meta: "textScore" } } )
Run Code Online (Sandbox Code Playgroud)
这可以正常工作并返回按分数排序的命中。
我也可以在没有 Morphia 的情况下直接使用 MongoDB Java 驱动程序来做到这一点。
// search with the Java driver
BasicDBObject textSearch = new BasicDBObject("$search", "brain");
BasicDBObject search = new BasicDBObject("$text", textSearch);
BasicDBObject meta = new BasicDBObject("$meta", "textScore");
BasicDBObject score = new BasicDBObject("score", meta);
List<DBObject> diseases = collection.find(search, score).sort(score).toArray();
Assert.assertEquals(2, diseases.size());
Assert.assertEquals("brain", diseases.get(0).get("name"));
Assert.assertEquals("benign-brain", diseases.get(1).get("name")); …Run Code Online (Sandbox Code Playgroud)