我无法理解Stream
Java 8中的接口,特别是它Spliterator
与Collector
接口有关的地方.我的问题是我根本就没有理解Spliterator
和Collector
接口,并因此在Stream
界面依然有些模糊了我.
究竟什么是a Spliterator
和a Collector
,我该如何使用它们?如果我愿意自己编写Spliterator
或Collector
(也可能是我自己的编写Stream
过程),我应该做什么而不是做什么?
我阅读了一些散布在网络上的例子,但由于这里的所有内容都是新的并且可能会有变化,因此示例和教程仍然非常稀少.
我正在尝试POST一个List
自定义对象.请求正文中的我的JSON是这样的:
{
"collection": [
{
"name": "Test order1",
"detail": "ahk ks"
},
{
"name": "Test order2",
"detail": "Fisteku"
}
]
}
Run Code Online (Sandbox Code Playgroud)
处理请求的服务器端代码:
import java.util.Collection;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path(value = "/rest/corder")
public class COrderRestService {
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response postOrder(Collection<COrder> orders) {
StringBuilder stringBuilder = new StringBuilder();
for (COrder c : orders) {
stringBuilder.append(c.toString());
}
System.out.println(stringBuilder);
return Response.ok(stringBuilder, MediaType.APPLICATION_JSON).build();
}
}
Run Code Online (Sandbox Code Playgroud)
实体COrder
:
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class …
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,它使用Jackson将一些数据存储在DynamoDB中,以便将我的复杂对象编组为JSON.
例如,我正在编组的对象可能如下所示:
private String aString;
private List<SomeObject> someObjectList;
Run Code Online (Sandbox Code Playgroud)
SomeObject可能如下所示:
private int anInteger;
private SomeOtherObject;
Run Code Online (Sandbox Code Playgroud)
和SomeOtherObject可能如下所示:
private long aLong;
private float aFloat;
Run Code Online (Sandbox Code Playgroud)
这很好,对象被编组没有问题,并作为JSON字符串存储在DB中.
当需要从DynamoDB检索数据时,Jackson会自动检索JSON并将其转换回来...除了'someObjectList'返回的List<LinkedHashMap>
不是List<SomeObject>
!这是杰克逊的标准行为,这不是一个错误.
所以现在这会导致问题.我的代码库认为它处理一个List<SomeObject>
但现实是它处理一个List<LinkedHashMap>
!我的问题是如何让我的LinkedHashMap回到'SomeObject'.显然这是一个手动过程,但我的意思是我甚至无法提取值.
如果我这样做:
for (LinkedHashMap lhm : someObjectList) {
// Convert the values back
}
Run Code Online (Sandbox Code Playgroud)
我收到一个编译错误,告诉我someObjectList的类型为'SomeObject'而不是LinkedHashMap.
如果我这样做:
for (SomeObject lhm : someObjectList) {
// Convert the values back
}
Run Code Online (Sandbox Code Playgroud)
我收到运行时错误,告诉我LinkedHashMap无法转换为'SomeObject'.
今天使用Postman时我注意到了方法选项PURGE
.我从未在实践中遇到它,也无法找到它的目的的解释.
这个方法用的是什么,它来自何处,是否有某种规格?
我有一个方法:
@POST
@Consumes("multipart/form-data")
@Produces( {"text/xml"})
public Response processForm(
@FormDataParam("myparam") InputStream is,
@FormDataParam("myparam") FormDataContentDisposition detail)
Run Code Online (Sandbox Code Playgroud)
这与Jersey 1.x一起运作良好.
我升级到2.0 m11.
现在我收到以下错误:
12/01/2013 11:15:04 AM org.glassfish.jersey.server.ApplicationHandler initialize
INFO: Initiating Jersey application, version Jersey: 2.0-m11 2012-12-21 12:34:15...
12/01/2013 11:15:04 AM org.glassfish.jersey.internal.Errors processErrors
SEVERE: The following errors and warnings have been detected:
WARNING: No injection source found for a parameter of type public javax.ws.rs.core.Response com.plutext.FileUpload.processForm(java.io.InputStream,org.glassfish
.jersey.media.multipart.FormDataContentDisposition) at index 0.
Run Code Online (Sandbox Code Playgroud)
我找到了 http://java.net/jira/browse/JERSEY-1413并提交了http://java.net/projects/jersey/lists/commits/archive/2012-09/message/126这似乎相关,但它的对我来说不明白如何解决这个问题.
更新
我创建了一个servlet,它在org.glassfish.jersey.server.ApplicationHandler初始化之前在Tomcat中运行:
public class Jersey2Init extends HttpServlet {
private static final …
Run Code Online (Sandbox Code Playgroud) 是否可以将JAX-RS Web服务重定向到另一个网页?
就像你使用Servlet一样response.sendRedirect("http://test/test.html")
.
JAX-RS Web服务本身应该重定向.我正在使用RESTEasy,如果这是相关的.
在Java 8中if/throw else/return是否有更短的语法?java.util.Optional
提供了在一个语句中完成此操作的方法,但它需要Optional
为每个具有非空引用的调用创建一个实例.
public static MyEnum fromString(String value) {
MyEnum result = enumMap.get(value);
if (result == null)
throw new IllegalArgumentException("Unsupported value: " + value);
return result;
}
Run Code Online (Sandbox Code Playgroud)
public static MyEnum fromString(String value) {
return Optional.ofNullable(enumMap.get(value)).orElseThrow(
() -> new IllegalArgumentException("Unsupported value: " + value));
}
Run Code Online (Sandbox Code Playgroud) 如果我有这样的类结构:
public abstract class Parent {
private Long id;
...
}
public class SubClassA extends Parent {
private String stringA;
private Integer intA;
...
}
public class SubClassB extends Parent {
private String stringB;
private Integer intB;
...
}
Run Code Online (Sandbox Code Playgroud)
是否有另一种方法来反序列化不同的@JsonTypeInfo
呢?在我的父类上使用此批注:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "objectType")
Run Code Online (Sandbox Code Playgroud)
我宁愿不必强制我的API的客户端包括"objectType": "SubClassA"
反序列化子Parent
类.
@JsonTypeInfo
杰克逊是否提供了一种注释子类并通过唯一属性将其与其他子类区分开来的方式,而不是使用?在上面的示例中,这将是"如果JSON对象"stringA": ...
将其反序列化为SubClassA
,如果它已将其"stringB": ...
反序列化为SubClassB
".
我只能在这里
访问在线版本:http://www.oracle.com/technetwork/java/javaee/documentation/index.html
我尝试检查Java EE下载页面:http:
//www.oracle.com/ technetwork/JAVA/JavaEE的/下载/ index.html的
但遗憾的是,我似乎无法找到仅下载Java EE 7 API文档的链接.
有没有办法在.zip下载它以供离线参考?
RESTEasy(一个JAX-RS实现)有一个很好的客户端框架,例如:
ServiceApi client = ProxyFactory.create(ServiceApi.class, baseUri);
Run Code Online (Sandbox Code Playgroud)
如何为此客户端提供HTTP身份验证凭据?