相关疑难解决方法(0)

Java 8 LocalDate Jackson格式

对于java.util.Date,当我这样做

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")  
  private Date dateOfBirth;
Run Code Online (Sandbox Code Playgroud)

然后在我发送的JSON请求中

{ {"dateOfBirth":"01/01/2000"} }  
Run Code Online (Sandbox Code Playgroud)

有用.

我应该如何为Java 8的LocalDate字段执行此操作?

我试过了

@JsonDeserialize(using = LocalDateDeserializer.class)  
@JsonSerialize(using = LocalDateSerializer.class)  
private LocalDate dateOfBirth;  
Run Code Online (Sandbox Code Playgroud)

它没用.

有人可以让我知道这是正确的方法吗?

以下是依赖项

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>jaxrs-api</artifactId>
     <version>3.0.9.Final</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.4.2</version>
</dependency>
<dependency>
    <groupId>com.wordnik</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.3.10</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

java json jax-rs resteasy jackson

110
推荐指数
12
解决办法
15万
查看次数

JAX-RS HATEOAS在JSON中使用Jersey,不需要的链接属性

从Jersey 2.9开始,可以通过声明性链接为超媒体驱动的REST API创建链接关系.

这段代码,例如:

@InjectLink(
    resource = ItemResource.class,
    style = Style.ABSOLUTE,
    bindings = @Binding(name = "id", value = "${instance.id}"),
    rel = "self"
)
@XmlJavaTypeAdapter(Link.JaxbAdapter.class)
@XmlElement(name="link")
Link self;
Run Code Online (Sandbox Code Playgroud)

......理论上预计会产生这样的JSON:

"link" : {
    "rel" : "self",
    "href" : "http://localhost/api/resource/1"
}
Run Code Online (Sandbox Code Playgroud)

但是,Jersey会生成不同的JSON,其中包含许多我不需要的属性:

"link" : {
   "rel" : "self",
   "uri" : "http://localhost/api/resource/1",
   "type": null,
   "uriBuilder" : null
}
Run Code Online (Sandbox Code Playgroud)

另请注意href,它使用的是代替uri.我查看了Jersey Link对象的实现并找到了JerseyLink.

我想使用Jersey的声明性链接,而不是推出我自己的实现.我最终使用Jackson注释只是为了忽略其他JerseyLink属性.

@JsonIgnoreProperties({ "uriBuilder", "params", "type", "rels" })
Run Code Online (Sandbox Code Playgroud)

有没有人使用与Jersey的声明性链接并且具有预期的JSON输出(例如,href而不是uri没有额外的Jersey属性)而不必使用JsonIgnoreProperties或其他黑客?

谢谢. …

java rest jax-rs jersey jersey-2.0

21
推荐指数
1
解决办法
1万
查看次数

阅读jersey的ParamConverter中的另一个参数

当给定一个格式化为Instant的原生ISO-8601的字符串时,或者作为自纪元以来的整数毫秒,我ParamConverter提供了一个Instant(Date).这工作正常,但我还需要能够支持其他日期格式(客户很挑剔).

为了避免经典dd/mm/yyyymm/dd/yyyy歧义,我希望客户指定他们的首选格式作为请求*的一部分.例如:

GET http://api.example.com/filter?since=01/02/2000&dateformat=dd/mm/yyyy
Run Code Online (Sandbox Code Playgroud)

传递给一个看起来像这样的方法:

@GET
String getFilteredList( final @QueryParam( "since" ) Instant since ) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

(为清楚起见省略了时间和时区部分)

所以我希望我ParamConverter<Instant>能够读取dateformat参数.

我已经能够使用设置ContainerRequestContext属性的过滤器和AbstractValueFactoryProvider类似的东西的组合,但是需要参数来应用自定义注释,并且不允许它与QueryParam/FormParam /等一起使用.它没那么有用了.

有没有办法从ParamConverter中获取其他参数或请求对象本身?

[*]在现实世界中,这将来自一系列预先批准的格式,但现在只是假设他们正在提供输入 DateTimeFormatter


为清楚起见,这是我的代码:

public class InstantParameterProvider implements ParamConverterProvider {
    private static final ParamConverter<Instant> INSTANT_CONVERTER =
            new ParamConverter<Instant>( ) {
                @Override public final T fromString( final String value ) {
                    // This is where I would like to get the other parameter's …
Run Code Online (Sandbox Code Playgroud)

java jax-rs jersey jersey-2.0

6
推荐指数
1
解决办法
3459
查看次数

如何(联合国)将日期作为杰克逊的时间戳进行编组

我遇到麻烦(联合国)将java.util.Date对象编组到时间戳中.理想情况下,时间戳应采用UTC-0格式,而不是服务器的本地时区.虽然如果需要,我可以很容易地解决这个问题.

注意:我知道这里有几个关于堆栈溢出的类似主题,但是我遇到的每个人都要么过时(关于正在使用的API),要么与将Date对象序列化为字符串有关.

以下是我的POM文件的摘录:

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.15</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

样本模型类:

public class PersonJSON {
    private Date birthDate;
}
Run Code Online (Sandbox Code Playgroud)

预期产出(假设出生日期为2015年2月1日00:00:00 UTC-0):

{"birthDate":1422748800000}
Run Code Online (Sandbox Code Playgroud)

当前输出:

{"birthDate":"2015-02-01"}
Run Code Online (Sandbox Code Playgroud)

是否可以解决这个问题(理想情况下使用注释)?

事实证明,错误是由Java.sql.Date到Java.util.Date的隐式转换引起的.转换不会抛出任何异常,并且sql.Date扩展了util.Date,因此逻辑上它应该可以工作,但事实并非如此.解决方案是从Java.sql.Date中提取时间戳,并将其用作Java.util.Date构造函数的输入.

如果您确实想要更改格式,假设您有一个有效的Java.util.Date对象,那么peeskillet列出的方法是正确的.

json jax-rs jersey jackson java.util.date

3
推荐指数
2
解决办法
7253
查看次数

标签 统计

jax-rs ×4

java ×3

jersey ×3

jackson ×2

jersey-2.0 ×2

json ×2

java.util.date ×1

rest ×1

resteasy ×1