我在Jackson 2.2.1中使用Jersey 1.17.1.
这似乎是杰克逊包切换从org.codehaus到com.fasterxml.我已正确配置所有代码并使用最新的jackson.然而,看起来泽西岛仍然在拉动org.codehaus.jackson.有什么办法可以缓解这种情况,还是应该坚持使用codehaus套装,直到泽西升级为使用fasterxml套装?
如果您熟悉Bean验证框架,则您知道无法获取方法参数的名称.因此,如果对方法的第一个参数执行@NotNull约束并且验证失败,则getPropertyPath将类似于"arg1".
我想创建我自己的@NotNull版本,它可以取一个值,例如@NamedNotNull("emailAddress").但我无法弄清楚如何覆盖我的Validator中的#getPropertyPath?有没有办法做到这一点,或者我坚持使用"arg1"或"arg2"等.
编辑
根据我收到的答案,我能够提出以下实现,允许我从@QueryParam或@PathParam注释中获取值,并将其用作Bean验证注释(如@NotNull)的属性路径.
对于Jersey,您需要创建以下类.请注意DefaultParameterNameProvider的实现:
public class ValidationConfigurationContextResolver implements ContextResolver<ValidationConfig> {
@Override
public ValidationConfig getContext( final Class<?> type ) {
final ValidationConfig config = new ValidationConfig();
config.parameterNameProvider( new RestAnnotationParameterNameProvider() );
return config;
}
static class RestAnnotationParameterNameProvider extends DefaultParameterNameProvider {
@Override
public List<String> getParameterNames( Method method ) {
Annotation[][] annotationsByParam = method.getParameterAnnotations();
List<String> names = new ArrayList<>( annotationsByParam.length );
for ( Annotation[] annotations : annotationsByParam ) {
String name = getParamName( annotations );
if ( name == null )
name = …Run Code Online (Sandbox Code Playgroud) 鉴于ABRecordID可以在云同步之间进行更改,并且在我无法控制的其他情况下,如何保持对IOS通讯簿记录的长期引用?
Apple提供以下指导:
"保持对特定记录的长期引用的推荐方法是除了标识符之外还存储名字和姓氏,或者名字和姓氏的哈希.当您按ID查找记录时,比较记录的名称为您存储的名称.如果它们不匹配,请使用存储的名称查找记录,并存储记录的新ID."
但我不明白这个指导.如果地址簿中可能包含重复的名称,并且由于用户可以修改记录中的名称,该建议如何工作?
例如,如果用户修改了地址簿记录的名称,我的例程将无法通过ABRecordID找到它,所以如果我认为通过我存储的名称哈希搜索不能找到重复的名称而不是新的ABRecordID用于该特定的记录我之前提到的?
最后,获得IOS AddressBook记录的长期参考的最佳方法是什么?如果上述建议确实有效,我错过了什么?
最近我和JPA一起经历了很多关于Timestamps的痛苦.我发现我的很多问题已经通过TIMESTAMPTZ用于我的字段而不是TIMESTAMP来清除.我的服务器是UTC,而我的JVM是PST.使用TIMESTAMP WITHOUT TIMEZONE时,JPA几乎不可能对数据库中的UTC值进行标准化.
对我来说,我将这些字段用于"用户何时创建","他们上次使用设备的时间","他们最后一次收到警报的时间"等等.这些通常是事件,因此它们是实例时间种类的价值观.因为他们现在将通过TIMESTAMPTZ,如果我不想要它们,我总是可以查询它们的特定区域.
所以我的问题是,对于Java/JPA/PostgreSQL服务器,什么时候我想在TIMESTAMPTZ上使用TIMESTAMP?有什么用例呢?现在我很难理解为什么我想要使用TIMESTAMP,因为我担心我没有抓住它的价值.
我有一个问题我无法理解.在休眠中,我对以下内容没有任何问题:
@GeneratedValue( strategy = GenerationType.AUTO, generator = "email-seq-gen" )
@SequenceGenerator( name="email-seq-gen", sequenceName="EMAIL_SEQ_GEN", allocationSize=500 )
Run Code Online (Sandbox Code Playgroud)
然后在我的schema.ddl中我有这个:
CREATE SEQUENCE EMAIL_SEQ_GEN START 1 INCREMENT 500;
Run Code Online (Sandbox Code Playgroud)
在这里看不多.一切都按预期工作.但是,如果我将提供程序切换到EclipseLink,我会收到此错误:
The sequence named [EMAIL_SEQ_GEN] is setup incorrectly. Its increment does not match its pre-allocation size.
Run Code Online (Sandbox Code Playgroud)
所以当然我谷歌周围看到一些关于EclipseLink创建负数的事情,如果初始值是1并且它应该等于allocationSize.
所以,好吧,所以添加"initialValue = 500"并将我的DDL脚本更新为"START 500"修复了这个问题,但现在我的编号从500开始而不是1.什么给出了?这是一个EclipseLink错误还是我不理解的东西.我想生成从1开始并具有调整到实体的分配大小的序列(在本例中为500).我如何使用EclipseLink执行此操作?
谢谢!
另一种问这个问题的方法是......给出这个DDL:
CREATE SEQUENCE EMAIL_SEQ_GEN START 1 INCREMENT 500;
Run Code Online (Sandbox Code Playgroud)
注释我的实体与EclipseLink一起使用它的正确方法是什么?
如果我让EclipseLink生成我的DDL,那么:
@GeneratedValue( strategy = GenerationType.AUTO, generator = "email-seq-gen" )
@SequenceGenerator( name="email-seq-gen", sequenceName="EMAIL_SEQ_GEN", initialValue=1, allocationSize=500 )
Run Code Online (Sandbox Code Playgroud)
会产生这个:
CREATE SEQUENCE EMAIL_SEQ_GEN INCREMENT BY 500 START WITH 500;
Run Code Online (Sandbox Code Playgroud)
哪种意味着使用EclipseLink创建一个"START WITH …
当我制作Spring项目时,我似乎得到了一堆这样的警告.该项目使用Compile Time Weaving和各种Spring注释,如Transactional,Autowired和Configurable.
我有三个问题:它们是什么(效果是什么)?我应该关注他们吗?和"我该怎么做才能删除它们?"
ajc: this affected type is not exposed to the weaver: com.myapp.domain.UserEntity [Xlint:typeNotExposedToWeaver]
Run Code Online (Sandbox Code Playgroud)
让我知道您需要帮我解决这个问题.我可以发布POM文件的相关部分,部分Java Spring配置文件或其他任何内容.我真的不知道需要什么,所以让我知道.
我在春季论坛上看到了它,但那个地方是一个鬼城.有几个人问了这个问题,但没有答案.
我正在使用Java配置Spring和CTW.
Hibernate版本4.2.3.Final是否支持类型安全的本机命名查询?我得到一个例外:
java.lang.ArrayIndexOutOfBoundsException: 0
at org.hibernate.ejb.AbstractEntityManagerImpl.createNamedQuery(AbstractEntityManagerImpl.java:637)
at sun.reflect.GeneratedMethodAccessor23.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:241)
at $Proxy78.createNamedQuery(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
当我使用Query类执行此查询时,一切都很好.TypedQuery似乎是这里的问题,异常不是很有帮助.我已经尝试过对非常复杂的查询进行简单查询,除非我使用Query查询命名的本机查询,否则它们似乎都会失败.
我对这个主题感到很困惑,并且在Spring 4.x文档中看到了很少的建议.首先让我说我可以按照我想要的方式配置我的项目.静态编织,编织时编织,无编织等
我只想要最佳性能.但如果性能差异是微秒,那么我只想要最简单.我只关心会影响我的客户的性能差异.
好的,以下是相关选项:
只要在运行时速度很快,我就可以为应用程序初始化添加一些时间.
那么这四种配置事务管理方式之间的权衡是什么?
是否有功能权衡还是仅仅是性能问题?
请注意,我使用的是Spring 4.0.2和Java 1.7.如果有基本上回答这个问题的Spring 4.0文档,那么我道歉并且只是将我重定向到doc.到目前为止,我已经看到文档说明如何设置它们而不是它们如何比较.谢谢!
另请注意,网络上关于此的大部分信息都已过时.所以我正在寻找当前的比较.
我已经看到了添加 JSON REST Hateoas 的两种主要方法,但我不确定哪种方法更标准或每种方法的优缺点。
我看到的典型方法(Atom Links)是返回的实体附加一个名为 或 的links字段_links。该字段是一个rel=<rel>和href=<href>对的数组。
但我也看到(链接标头)链接放入名为“Link”的标头值中。该链接是一个格式为 的集合<hef>; rel=<rel>。
另外,我注意到在 JAX-RS 中似乎没有添加具有完全限定的 href 的 Atom 链接,只有路径。我所说的完全合格是指包括计划和权威。在使用 Atom Links for HATEOAS 时,为 href 提供完整的 URI 是否被视为不好的做法?
我正在寻找一种java并发习惯用法来匹配具有最高吞吐量的大量元素.
考虑一下我有"人"来自多个线程.每个"人"都在寻找一场比赛.当它找到另一个等待的"人"时,它们相互匹配并被移除以进行处理.
我不想锁定一个大的结构来改变状态.考虑Person有getMatch和setMatch.在提交之前,每个人的#getMatch都是null.但是当他们解锁(或被捕获)时,他们要么已经过期,因为他们等待长时间的比赛或#getMatch是非空的.
保持高通过率的一些问题是,如果PersonA与PersonB同时提交.它们相互匹配,但PersonB也匹配已经在等待的PersonC.PersonB的状态在提交时变为"可用".但是当PersonB与PersonC匹配时,PersonA不需要偶然获得PersonB.合理?另外,我想以异步方式执行此操作.换句话说,我不希望每个提交者都必须在具有waitForMatch类型的东西的线程上持有Person.
同样,我不希望请求必须在不同的线程上运行,但是如果有一个额外的匹配器线程也没关系.
似乎应该有一些成语,因为它似乎是一个非常普遍的事情.但我的谷歌搜索已经枯竭(我可能使用错误的条款).
UPDATE
有几件事让我很难解决这个问题.一个是我不想在内存中有对象,我想让所有等待的候选人都使用redis或memcache或类似的东西.另一个是任何人可能有几个可能的比赛.考虑如下界面:
person.getId(); // lets call this an Integer
person.getFriendIds(); // a collection of other person ids
Run Code Online (Sandbox Code Playgroud)
然后我有一个看起来像这样的服务器:
MatchServer:
submit( personId, expiration ) -> void // non-blocking returns immediately
isDone( personId ) -> boolean // either expired or found a match
getMatch( personId ) -> matchId // also non-blocking
Run Code Online (Sandbox Code Playgroud)
这是一个休息界面,它会使用重定向,直到你得到结果.我的第一个想法是在MatchServer中有一个Cache,它由redis之类的东西支持,并且对于当前被锁定和被操作的对象具有并发的弱值哈希映射.每个personId将由持久状态对象包装,状态为已提交,匹配和过期.
到目前为止?非常简单,提交代码完成了初始工作,它是这样的:
public void submit( Person p, long expiration ) {
MatchStatus incoming = new MatchStatus( p.getId(), expiration );
if ( !tryMatch( incoming, p.getFriendIds() ) …Run Code Online (Sandbox Code Playgroud) hibernate ×3
java ×3
jpa ×3
spring ×2
aspectj ×1
concurrency ×1
eclipselink ×1
hateoas ×1
ios ×1
iphone ×1
jackson ×1
jax-rs ×1
jdbc ×1
jersey ×1
jersey-2.0 ×1
json ×1
objective-c ×1
postgresql ×1
rest ×1