标签: annotations

如何使用带有iBatis(myBatis)的注释进行IN查询?

我们只想使用MyBatis的注释; 我们真的想避免使用xml.我们正在尝试使用"IN"子句:

@Select("SELECT * FROM blog WHERE id IN (#{ids})") 
List<Blog> selectBlogs(int[] ids); 
Run Code Online (Sandbox Code Playgroud)

MyBatis似乎无法选择整数数组并将其放入生成的查询中.它似乎"软弱地失败",我们没有得到任何结果.

看起来我们可以使用XML映射来实现这一点,但我们真的想避免这种情况.是否有正确的注释语法?

java annotations ibatis mybatis

28
推荐指数
4
解决办法
3万
查看次数

使用注释确保方法返回的值不会被丢弃

String在Java中是不可变的.从广义上讲,以下片段是"错误的".

String s = "hello world!";

s.toUpperCase(); // "wrong"!!

System.out.println(s); // still "hello world!"!!!
Run Code Online (Sandbox Code Playgroud)

尽管这是"错误的",代码编译和运行,也许是许多初学者的困惑,他们必须被告知错误是什么,或者通过查阅文档找出自己.

阅读文档是理解API的重要部分,但我想知道是否可以通过额外的编译时检查来补充它.特别是,我想知道是否可以使用Java的注释框架来强制执行某些方法返回的值不被忽略.然后,API设计者/库作者将在其方法中使用此批注来记录不应忽略的返回值.

一旦API补充了这个注释(或者可能是另一种机制),那么每当用户编写如上所述的代码时,它就不会编译(或者通过严厉的警告进行编译).

那么这可以做到,你会怎么做这样的事情?


附录:动机

很明显,在一般情况下,Java 应该允许忽略方法的返回值.可以在大多数时间安全地忽略像List.add(always true),System.setProperty(previous value)这样的方法的返回值.

然而,也有很多的方法,其返回值应被忽略.这样做几乎总是程序员错误,或者不正确使用API​​.这包括以下内容:

  • 关于不可变类型(例如String,BigInteger等)的方法,它返回操作结果而不是改变它被调用的实例.
  • 方法,其返回值是其行为的重要组成部分,不应该被忽视,但人们有时会做呢(如InputStream.read(byte[])返回读取的字节数,这应该被假定为阵列的整个长度)

目前,我们可以编写忽略这些返回值的代码,并让它们在没有警告的情况下编译和运行.静态分析检查器/ bug查找器/样式执行器/等几乎可以肯定地将这些标记为可能的代码气味,但如果可以通过API本身(可能通过注释)强制执行,那么它似乎是合适的/理想的.

一个类几乎不可能确保它总是"正确"使用,但它可以做些什么来帮助指导客户正确使用(参见:Effective Java 2nd Edition,Item 58:对可恢复的条件使用已检查的异常和编程错误的运行时异常项62:记录每种方法抛出的所有异常).有一个注释可以强制客户端不要忽略某些方法的返回值,并且编译器在编译时以错误或警告的形式强制执行它,这似乎符合这个想法.


附录2:片段

以下是初步尝试,简洁地说明了我想要实现的目标:

@interface Undiscardable { }
//attachable to methods to indicate that its
//return value must not be discarded

public class UndiscardableTest { …
Run Code Online (Sandbox Code Playgroud)

java annotations api-design return-value

28
推荐指数
3
解决办法
8958
查看次数

C++中类似Java的注释

在C++中是否有类似Java的注释?

例如,@ Override注释标记一个函数,它覆盖另一个函数,如果不是,它将在编译时给出错误.

我在C++中寻找这样的东西.

c++ java annotations

28
推荐指数
2
解决办法
2万
查看次数

用于包装方法的Java注释

我有很多样板代码基本上遵循这种模式:

function doSomething() {
  try {
    [implementation]
    [implementation]
    [implementation]
    [implementation]
  } catch (Exception e) {
    MyEnv.getLogger().log(e);
  } finally {
    genericCleanUpMethod();
  }
}
Run Code Online (Sandbox Code Playgroud)

我想创建自己的注释来清理我的代码:

@TryCatchWithLoggingAndCleanUp
function doSomething() {
  [implementation]
  [implementation]
  [implementation]
  [implementation]
}
Run Code Online (Sandbox Code Playgroud)

方法签名变化很大(取决于方法的实际实现),但样板try/catch/finally部分始终相同.

我想到的注释会自动用整个try...catch...finallyhoopla 包装带注释的方法的内容.

我一直在寻找一种直截了当的方法,但却没有找到任何东西.我不知道,也许我只是看不到所有注释树木的树林.

关于如何实现这样的注释的任何指针都将非常感激.

java methods annotations

28
推荐指数
2
解决办法
2万
查看次数

如何使用@XmlElement注释列表?

我使用以下注释javax.xml.bind.annotation.XmlElement:

@XmlElement         
public List<String> getKeywords() {
    return keywords;
}
Run Code Online (Sandbox Code Playgroud)

当我编写一些示例内容时,会产生以下XML:

<keywords>keyword1</keywords>
<keywords>keyword2</keywords>
Run Code Online (Sandbox Code Playgroud)

我想获得以下XML:

<keywords>
    <keyword>keyword1</keyword>
    <keyword>keyword2</keyword>
</keywords>
Run Code Online (Sandbox Code Playgroud)

我应该使用什么样的注释?

我试过了

@XmlElementWrapper
@XmlElement(name="keyword")
Run Code Online (Sandbox Code Playgroud)

但随后整个内容消失,结果是:

<keywords/>
Run Code Online (Sandbox Code Playgroud)

如果我只尝试重命名元素,也会发生同样的情况:

@XmlElement(name="keyword")
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

更新:

这是根据第一个答案更新的类的完整代码,但它仍然无效(<keywords/>当编组为XML时,结果是一个空列表):

import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Content {

    private List<String> keywords;

    public Content() {}

    @XmlElementWrapper(name="keywords")
    @XmlElement(name="keyword")
    public List<String> getKeywords() {
        return keywords;
    }

    public void setKeywords(List<String> keywords) {
        this.keywords = keywords;
    }  

}
Run Code Online (Sandbox Code Playgroud)

我也尝试了以下相同的结果:

import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import …
Run Code Online (Sandbox Code Playgroud)

java xml annotations jaxb

28
推荐指数
2
解决办法
4万
查看次数

javaFX 8中@NamedArg注释的目的是什么?

我想知道JavaFX 8中@NamedArg注释的用例是什么

javadoc没有给我们更多细节,Javadoc:Annotation提供有关参数名称的信息.

互联网上没有更多信息,文档和示例.

也许有人可以帮忙?

问候.

java annotations javafx

28
推荐指数
1
解决办法
4667
查看次数

如何使用注释将bean指定为非延迟

有没有人知道如何在使用注释配置bean时将bean指定为非延迟?

spring annotations spring-annotations

27
推荐指数
3
解决办法
3万
查看次数

如何在java中获取参数的注释?

我是一名新的Java程序员.以下是我的代码:

    public void testSimple1(String lotteryName,
                        int useFrequence,
                        Date validityBegin,
                        Date validityEnd,
                        LotteryPasswdEnum lotteryPasswd,
                        LotteryExamineEnum lotteryExamine,
                        LotteryCarriageEnum lotteryCarriage,
                        @TestMapping(key = "id", csvFile = "lottyScope.csv") xxxxxxxx lotteryScope,
                        @TestMapping(key = "id", csvFile = "lotteryUseCondition.csv") xxxxxxxx lotteryUseCondition,
                        @TestMapping(key = "id", csvFile = "lotteryFee.csv") xxxxxxxx lotteryFee)
Run Code Online (Sandbox Code Playgroud)

我想获得所有提交的注释.有些字段是注释的,有些则不是.

我知道如何使用method.getParameterAnnotations()函数,但它只返回三个注释.

我不知道如何对应它们.

我期待以下结果:

lotteryName - none
useFrequence- none
validityBegin -none
validityEnd -none
lotteryPasswd -none
lotteryExamine-none
lotteryCarriage-none
lotteryScope - @TestMapping(key = "id", csvFile = "lottyScope.csv")
lotteryUseCondition - @TestMapping(key = "id", csvFile = "lotteryUseCondition.csv")
lotteryFee - @TestMapping(key = …
Run Code Online (Sandbox Code Playgroud)

java reflection annotations

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

如何在Sublime Text编辑器中显示git作者姓名?

我正在使用GitGutter和Sublime Text编辑器.

使用此插件Git>此文件> blame将打开一个带有annontations的新选项卡.

有没有办法在行号前面的同一个编辑窗口中显示Git注释

git annotations sublimetext

27
推荐指数
2
解决办法
2万
查看次数

Selenium @FindBy vs driver.findElement()

我为什么要用@FindByvs driver.findElement()

@FindBy强迫我将所有变量移动到类级别(当大多数变量只需要在方法级别时).它似乎唯一能给我买的是我可以调用PageFactory.initElements(),它为我处理延迟初始化.

我错过了什么?

selenium annotations findby selenium-webdriver page-factory

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