我们的应用程序中有两个部分:
服务器 - 提供REST服务
客户端 - 通过Spring restTemplate使用它们
除了HTTP状态之外,我们的服务器还返回一个带有JSON的HTTP主体,它详细描述了错误.所以,我已经为restTemplate添加了自定义错误处理程序来处理一些编码为非错误的错误 - 它有助于解析HTTP正文.
但是,在HTTP/1.1 401 Unauthorized的情况下,我通过解析HTTP正文获得异常.所有其他错误代码都处理得很好(400,402等)我们正在使用普通服务器逻辑,在发生错误时发送HTTP响应,对于不同类型的错误没有特殊规则:
writeErrorToResponse(int status, String errMsg, HttpServletResponse resp) throws IOException {
response.setStatus(status);
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
String message = String.format("{\"error\":\"%s\"}", StringUtils.escapeJson(errMsg));
resp.getWriter().println(message);
}
Run Code Online (Sandbox Code Playgroud)
但在客户端只有HTTP/1.1 401抛出异常 - "java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode"
我做了一些调试,发现问题的原因是SimpleClientHttpResponse中的代码:
HttpURLConnection.getInputStream()
使用Fiddler进行跟踪会有以下响应:在客户端上解析消息是正确的:
HTTP/1.1 402 Payment Required
X-Powered-By: Servlet/3.0
Content-Type: application/json
Content-Language: en-GB
Content-Length: 55
Connection: Close
Date: Sat, 25 May 2013 10:10:44 GMT
Server: WebSphere Application Server/8.0
{"error":"I cant find that user. Please try …Run Code Online (Sandbox Code Playgroud) 我有关于spring-data的DAO实现:
public interface TestDataRepository extends CrudRepository<DpConfigData, Long> {
@Query(value = "select distinct(oid) from unit", nativeQuery = true)
List<Long> testMethod();
}
Run Code Online (Sandbox Code Playgroud)
和单元测试来测试被管理的DAO:
@Test
public void test(){
List<Long> testData = dpConfigDataEntityDataRepository.testMethod();
for (Long oid:testData){
System.out.print(oid);
}
}
Run Code Online (Sandbox Code Playgroud)
运行测试会产生奇怪的结果 - List<Long> testData在运行时由BigInteger实例填充,而不是由Long填充.结果我得到ClassCastException:java.math.BigInteger无法强制转换为java.lang.Long
JPA实现 - Hibernate.作为DB我使用PostgreSQL,unit.oid字段在DB层上有BigInt类型.在获取整个单元的情况下它被映射到Long,但是使用自定义查询作为"select distinct ..."时出现了错误并且它被映射到BigInteger.
所以,我的问题是:这种奇怪行为的原因是什么?如何以优雅的方式解决/解决它?
我们将在开发中使用WebSphere 8.0 app服务器.
我们的Web应用程序使用Amazon aws java sdk,它依次使用Apache http-client 4.1.
但是WebSphere的库中也有http-client类,它们似乎与我们的web-app中的http-client冲突.
我找到了随WebSphere一起分发的下一个http-client类列表:
\ WebSphere\AppServer\plugins\com.ibm.ws.prereq.jaxrs.jar(http-client 4.0.1)
\WebSphere\AppServer\runtimes\com.ibm.jaxrs.thinclient_8.0.0.jar
所以,我的问题是:如何首先加载位于我的应用程序中的类而不是WebSphere app容器提供的类?
java中是否有一种编写通用接口的方法,以更方便的方式指出这种接口的实现者?
例如我写的界面:
public interface Updatable<T> {
void updateData(T t);
}
Run Code Online (Sandbox Code Playgroud)
我想指出只有实现者的实例可以在updateData(T t)方法中传递.
所以,我必须写这样的东西:
public class Office implements Updatable<Office> {
@Override
public void updateData(Office office) {
//To change body of implemented methods use File | Settings | File Templates.
}
...
...
...
}
Run Code Online (Sandbox Code Playgroud)
但似乎有点难看.你有更好的变种吗?