quinta-feira, 4 de novembro de 2010

@autowired + @webservice sem nullpointerexception

Opa,
Fato estranho esta acontecendo com um webservice que esta lançando um nullpointerexception
tando a classe Service como a clase WebService esta anotada e inicializava normal publicando o serviço,mas quando tentava usar (consumir) o serice que estava anotado com Autowired esta nulo,
ou seja, o spring não estava injetando.

Checado todas as anotações e verificado a ordem de inicialização do spring, percebi que a minha classe anotada com @webservice que não tinha interface nenhuma, tinha que ser percebida primeiro pelo spring so depois pelo CXF, entao como fazer isso?

segue o codigo:

<context:component-scan base-package="br.com.cri.service" />

<context:annotation-config/>

<context:component-scan base-package="br.com.cri.ws">
<context:include-filter type="annotation" expression="javax.jws.WebService" />
/context:component-scan>

import resource="classpath:META-INF/cxf/cxf.xml" />
import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

<jaxws:endpoint
id="matonWebServiceEndpoint"
implementor="#matonWebService"
address="/MatriculaOnLine" />



a classe Service é normal, so colocar o @Service

a classe WebService ficou assim:




@WebService
@SOAPBinding(style=Style.RPC, use=Use.LITERAL, parameterStyle=ParameterStyle.WRAPPED)
public class MatonWebService {

@Autowired
private MatriculaService matriculaService;


public Retorno atualizandoServentia(@WebParam(name = "serventia") String id,
@WebParam(name = "atualizando") boolean atualizando) {
return matriculaService.atualizandoServentia(id, atualizando, true);
}

sexta-feira, 15 de outubro de 2010

Definições de problemas com thread

Estudando multithread inventei algumas definições:

Deadlock: quando os banco estão em greve.

Starvation: quando tem um cobrador na sua frente com uma baita pasta cheia de documentos pra pagar.

Livelock: um dia depois de acabar a greve e voce tem enfrentar fila.

sexta-feira, 30 de julho de 2010

getContentType from File

Dica simples, como pego o contenttype de uma determinado arquivo para jogar na resposta de um servelt por exempo


FileTypeMap fMap = FileTypeMap.getDefaultFileTypeMap();
String contentType = fMap.getContentType(new File("test.pdf")));

ou

FileNameMap fileNameMap = URLConnection.getFileNameMap();
String tipo = fileNameMap.getContentTypeFor(new File("test.pdf").getName());

segunda-feira, 3 de maio de 2010

MVC+J

Opa, maio mês das noivas e como diz um amigo meu, casar é bom, mas morrer queimado é um pouquinho pior :)
Ok sem mais delongas vou comentar a respeito de um novo conceito que recentemente vi na web o MVC+J.

Você ja deve ter ouvido falar do famoso MVC (Model, View e Control), agora o que esse J ta fazendo ai? É j de ajax, ou seja é aquela pagina que dinamicamente vai ganhando conteudo ou realizando chamadas sem precisar realizar uma nova requisição na pagina inteira.

Entao temos as seguintes opções:

Model - Dao´s, Services utilizando JPA(hibernate, toplink), JDBC, WebServices geralmente o Spring integrando tudo.

Control - Frameworks web como o proprio Spring MVC, Faces, Struts, WebWork

View - JSP com JSTL, JSF, Groovy

e o J - com JQuery, Prototype, DoJo.

A arquitetura que escolhi foi String com iBatis, e por ja utilizar o framework Spring, aproveitei a parte web dele com o Spring MVC, com view em JSP com JSTL, e jQuery por ser o mais rapido e tem um grande numero de widgets (componente) escritos com sua linguagem.

Outra teoria minha é que esse J possa ser de JSON uma vez que os componentes jQuery podem fazer interação direto com os controller´s utilizando essa anotação.

quarta-feira, 14 de abril de 2010

JQuery, IE6, and 'Could not set the selected property. Unspecified error.'

Opa,

pela primeira vez o jQuery me decepcionou, brincadeira, a culpa nao é dele e sim do Internet Explorer.

estava fazendo um form com dois combos um para ano e outro pra mes, e gostaria que viesse selecionado os itens da data atual.

utilizei

$("#mesoption[value='04']").attr('selected', 'selected');


so que testando no IE6 da o erro Could not set the selected property. Unspecified error, pesquisando no google parece que é um problema do DOM.

então a solução foi colocar selected no momento da criação do option

var listMes = {'01':'Janeiro', '02':'Fevereiro', '03':'Março', '04':'Abril', '05':'Maio', '06':'Junho', '07':'Julho', '08':'Agosto', '09':'Setembro', '10':'Outubro', '11':'Novembro', '12':'Dezembro'};
var agora=new Date();
var mesAtual = agora.getMonth();
var anoAtual = agora.getFullYear();
var optionSelected = "<option selected>/option>";
var optionNormal = "<option>/option>";

.each(listMes, function(key, value)
{
$('#mes').append($((parseInt(mesSelected) == parseInt(key) ? optionSelected : optionNormal)).attr("value",key).text(value));
});


ok assim funga o trem

terça-feira, 23 de fevereiro de 2010

DPEC Erro Root element is missing

Opa,
esse mês gostaria de continuar escrevendo sobre o spring security e como utiliza-lo atravez de anotação, mas acabei compranto um iphone, dai pensei em escrever um tutorial de como turbinalo, mas vou acabar escrevendo sobre um problema enfrentado que me tirou toda a atenção esses mês :(

Server was unable to process request. ---> Root element is missing.

Esse erro é retornado quando é enviado uma DPEC(resumo das notas fiscais eletronicas) ao projeto NF-e. O erro aparentemente é causado por alguma falha na formatação do XML certo?

Não, infelizmente não é o caso. Justifico:

Primeiro e mais estranho - A mesma DPEC uma hora é aceita outra hora o erro ocorre.
Segundo - O exemplo do manual de contiguencia esta tudo errado e nao serve de base para conferencia.
Terceiro - eu testei com 3 (três maneiras diferentes de envio e a mesma coisa acontecia.
Quarto (já tava no desespero), interceptei as mensagem enviado do proprio programa emissor do projeto que é disponibilizado gratuitamente, e estava igual ao do meu sistema.
Quinto - o erro tambem o ocorre no sitema deles kkkkkkkkkkkkkkk (ri alto)
Sexto - enviei email para o suporte, liguei no 0800, liguei ate em sao paulo na prodesp e ninguem sabe me responder o que acontece

Então meus amigos, o que fazer? Rezar paro o sistema não precisar de contingência?
O que aqui no Paraná quase nao acontece (rir alto)

sexta-feira, 15 de janeiro de 2010

Spring Security 3.0

Opa,

de volta das festas, resolvi criar um projeto utilizando maven,
ja tinha visto alguma coisa na pos-graduaçao, mas o desafio
era maior agora, pois quero criar um projeto que vai utilizar
ibatis na parte de persistencia, e Spring MVC para camada web
e Spring Security para controlar as permissoes do usuario e seu login.

Inicialmente coloquei o plugin m2eclipse (http://docs.codehaus.org/display/M2ECLIPSE/Home),
com ele no eclipse eu ja crio o projeto com o artefact para web.

Uma vez criado o projeto, vamos ao famoso pom.xml. Como eu queria utilizar a ultima versao do Spring a 3.0 o arquivo ficou assim:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.mactus</groupId>
<artifactId>projectus</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Gerenciador de Projetos da Mactus Infomatica</name>
<url>http://projectus.mactus.com.br</url>
<repositories>
<repository>
<id>spring-milestone</id>
<name>Spring Milestone Repository</name>
<url>s3://maven.springframework.org/milestone</url>
</repository>
<repository>
<id>ibatis</id>
<name>Ibatis repo</name>
<url>http://svn.apache.org/repos/asf/ibatis/java/ibatis-2/trunk/ibatis-2-core/</url>
</repository>
<repository>
<id>spring-maven-milestone</id>
<name>Springframework Maven Repository</name>
<url>http://s3.amazonaws.com/maven.springframework.org/milestone</url>
</repository>

</repositories>
<pluginRepositories>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>



<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-acl</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.version}</version>
</dependency>




<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-sqlmap</artifactId>
<version>2.3.4.726</version>
</dependency>


</dependencies>
<build>
<finalName>projectus</finalName>
</build>
<properties>
<spring.version>3.0.0.RELEASE</spring.version>
</properties>
</project>



O proximo passo foi colocar as configuraçoes certa em cada xml de configuracao do webproject

web.xml


<web-app>

<display-name>Archetype Created Web Application</display-name>

<welcome-file-list>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>

<!-- Carrega as configuraçoes do Spring security-->

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-security.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Mapeamento para o String MVC-->

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>

<!-- Adicionar filtro para Segurança-->

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


<!-- Vincular httpsession com o esquema de segurança do Spring-->

<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>

</web-app>


applicationContex-security.xml


<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">

<http auto-config='true'>

<intercept-url pattern="/login.htm" filters="none" />
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page="/login.htm" always-use-default-target="false"
authentication-failure-url="/login.htm?authfailed=true" />
<logout invalidate-session="true" logout-success-url="/login.htm?loggedout=true"/>

<session-management>
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/>
</session-management>

</http>

<!-- Aqui voce pode substituir por um bean que vai no banco de dados e verificao o usuario -->

<authentication-manager>
<authentication-provider>
<user-service>
<user name="user1" password="pass1" authorities="ROLE_USER, ROLE_ADMIN" />
<user name="user2" password="pass2" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>

</beans:beans>


dispatcher-servlet.xml


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:annotation-config />

<context:component-scan base-package="br.com.mactus.web"/>

<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

</beans>


Com essas configuraçoes voce ja pode inicial um projeto com autenticacao
para continuar voce vai fazer a parte de dao e service mas dai voce pode escolher
como vai fazer, com jdbc simples, hibernate, toplink... tudo por conta do Spring

Para finalizar vou colocar um exemplo de controller



@Controller
public class MainController {


@RequestMapping(value="/index", method = RequestMethod.GET)
public String index() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication.getAuthorities().contains("ROLE_ADMIN")) {
return "redirect:homeAdmin.htm";
} else {
return "redirect:home.htm";
}
}

@RequestMapping(value="/login", method = RequestMethod.GET)
public void login() {

}

@RequestMapping(value="/home", method = RequestMethod.GET)
public void home() {

}

@RequestMapping(value="/homeAdmin", method = RequestMethod.GET)
public void homeAdmin() {

}

}




Pra comerçar a brincadeira e´ isso por enquanto..