我使用Spring和Apache CXF实现现有接口的另一个实现。当tomcat启动时,它会显示以下错误消息:
ModuleInterface中的方法getSomething没有JAX-RS路径或HTTP 方法注释
并且,两个端点都返回404。
我不确定我错过了什么。任何人都不知道吗?
@Configuration
@ImportResource({"classpath:/META-INF/cxf/cxf-servlet.xml", "classpath:/META-INF/cxf/cxf.xml"})
public class APIConfig {
@Autowired @Lazy ModuleInterface moduleInterface;
@Bean
public Server initCxfServer(){
JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setServiceBeanObjects(getJaxRsResources());
sf.setProviders(Arrays.asList(
new JacksonJaxbJsonProvider()
));
return sf.create();
}
private Object[] getJaxRsResources() {
return new Object[]{
moduleInterface
};
}
private HashMap getExtMaps() {
return new HashMap<String,String>(){{
put("json","application/json;charset=utf-8");
put("xml","application/xml;charset=utf-8");
put("wadl","application/vnd.sun.wadl+xml");
put("desc","application/vnd.sun.desc+json;charset=utf-8");
}};
}
-
ldapsearch
-
./ldapsearch -p 1545 -Z -X -D "cn=Directory Manager" -w passwd -b "o=platform" "(objectClass=*)" | grep -i secret
-
html, body{height:100%; margin:0;padding:0}
.container-fluid{
height:100%;
display:table;
width: 100%;
padding: 0;
}
.row-fluid {height: 100%; display:table-cell; vertical-align: middle;}
.centering {
float:none;
margin:0 auto;
background: #abc;
height: 25px;
}
答案 0 :(得分:1)
如果您在接口和实现类中使用@Valid
(或者甚至是@Context
之类的其他注释)来声明两个方法中的参数,则可能会发生这种情况。
仅将注释保留在使用@Path
注释的方法的参数上(无论是在接口中,还是在实现类中),它应该可以正常工作。
答案 1 :(得分:0)
您需要让CXF了解您的服务和/或配置CXF。
请参阅:http://cxf.apache.org/docs/jaxrs-services-configuration.html#JAXRSServicesConfiguration-ConfiguringJAX-RSservicesincontainerwithSpringconfigurationfile了解使用Spring的CXF JAX-RS配置。
修改强>
如果你有多个实例,你希望哪一个实例加载下一行?
@Autowired @Lazy ModuleInterface moduleInterface;
阵列不应该达到你想要的效果吗?喜欢:
@Autowired @Lazy ModuleInterface[] moduleInterfaces;
答案 2 :(得分:0)
扫描您的课程以了解可以接收请求的方法(Resource methods
)。
getSomething
是候选者,因为它具有参数注释@Valid
,但它不符合资源方法,因为它缺少JAX-RS路径或HTTP方法注释。
例如,添加@GET
注释将执行此操作(如果您希望通过此方法接收HTTP GET请求)。
public interface ModuleInterface {
@GET
public Response getSomething(@Valid RequestObj obj);
}
答案 3 :(得分:0)
我有同样的警告。在我的情况下,我使用了CXF 3.1.3,我错过了在karaf中添加弹簧功能。
有关详细信息,请参阅Migration Guide至CXF 3.1.x
答案 4 :(得分:0)
添加bean的名称并使用限定符注释
@Service("foo")
@Path("/foo")
public class FooClass implements ModuleInterface {
public Response getSomething(@Valid Request obj){
// code
}
}
--
@Service("foov2")
@Path("/new/foo")
public class FooV2Class implements moduleInterface {
public Response getSomething(@Valid Request obj){
// code
}
}
@Component
public class Service {
@Autowired
@Qualifier("foo")
ModuleInterface moduleInterface
}